Java基础之Socket编程

时间:2023-02-21 14:15:47

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);
		}