1. Socket的作用
用于计算机与计算机之前通过网络传输数据通讯-->Socket
2. 基本网络知识
IP:计算机在网络的唯一标示,通过IP地址就可以找到一台计算机
端口:操作系统上软件的唯一标记。80(Web默认端口),3306(MySQL默认端口),1024以前的端口都被系统占用了。端口的范围:1~65535。定义端口的时候最好使用1024以后的端口。
协议:UDP 和 TCP
2.1 UDP 和 TCP的区别
UDP:无连接,速度快。不保证数据的完整性。
TCP:通过三次握手机制,形成数据传输通道(字节流),速度慢。保证数据的完整性,如果丢包,会重发!
3. Socket编程示例:
3.1 服务端代码:(需求:发一段话到客户端,然后接受从客户端发回来的数据打印)
try {
// 1.创建服务器端Socket对象(服务端IP:192.168.10.1)
ServerSocket ss = new ServerSocket(8888);
System.out.println("服务器已经启动,正在监听8888端口...");
// 2.不断接收客户端的请求
while (true) {
final Socket socket = ss.accept();
System.out.println("接收客户端:"+socket);
//每个客户端的处理启动一个新的线程
new Thread(){
public void run(){
try{
// 获取客户端(访问者)的iP地址
String ip = socket.getInetAddress().getHostAddress();
// 3.构建数据发送的通道
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
// 3.1 构建数据接收通道
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
// 4.发送数据
br.write("你们好,请发你们的名字过来\r\n");
br.flush();//手动刷新缓存区,发送数据
System.out.println("来自于" + ip + ",说:" + reader.readLine());
//5.关闭资源
br.close();
reader.close();
socket.close();
}catch(Exception e){
throw new RuntimeException(e);
}
}
}.start();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
3.2 客户端代码:(接收服务端发出的数据,打印,然后把自己的名字发送到服务端。 服务端IP:192.168.10.1, 端口:8888)
// 1.创建客户端的Socket对象
try {
Socket socket = new Socket("192.168.10.1", 8888);
// 2.构建和服务器端的数据接收通道
BufferedReader reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
// 构建和服务器端的数据发送通道
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
// 3.接收服务器发送的数据
System.out.println(reader.readLine());
// 4.发送数据到服务器端
writer.write("我的名字eric");
writer.newLine();
writer.flush();//手动刷新
//5.关闭资源
reader.close();
socket.close();
} catch (Exception e) {
throw new RuntimeException(e);
}