JAVA 网络编程 Socket 详细说明,实现客户端和服务端相互推送消息

客户端代码:

package com.lcx.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 
 * @author
 */
public class SocketClient {
	public static void main(String[] args) {
		try {
			/**
			 * 回想下流的读入写出概念:
			 * 		如果是磁盘IO,那么何为读入?将磁盘内容读入到内存中。何为写出?将内存的内容写出到磁盘中持久化。
			 * 		如果是网络IO,那么何为读入?将网络传输的内容读入到内存中。何为写出?将内存的内容写出到网络传输中。
			 * 以InputStream/Reader结尾的一般是 读入字节/字符流。
			 * 以OutputStream/Writer结尾的一般是 写出字节/字符流。
			 * 主要步骤:
			 * 1、客户端根据服务器端IP地址和端口号获取socket对象。
			 * 2、根据socket对象获取读入流,获取服务端反馈的内容。将字节流转换成字符流,然后处理信息。
			 * 3、根据socket对象获取写出流,用于想服务端发送内容。同样将字节流转换成字符流,然后处理信息。
			 * 4、关流、关socket
			 * 用单线程实现客户端和服务端简单的消费推送
			 * 随后实现客户端和服务端进行通话
			 */
			//1、获取socket对象
			Socket socket = new Socket(InetAddress.getLocalHost(), 6666);
			//2、获取读入流
			BufferedReader acceptServerInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			/**
			 * 网上字符流的写出大都用的PrintWriter,我想字符流读入用的 BufferedReader那么字符流的写出也可以用BufferedWriter
			 * 实际上是可以,PrintWriter.println可以直接结束本行开始下一个文本行,而BufferedWriter必须BufferedWriter.newLine
			 * 手动结束本行开始下一行。write方法调用后,再其后必须调用newLine实现该文本行的结束,否则BufferedReader读取不到
			 * 
			 */
			//3、获取写出流,BufferedWriter实现
			BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			bufferedWriter.write("客户端:我是客户端");
			bufferedWriter.newLine();
			bufferedWriter.write("客户端:我是客户端的王五");
			bufferedWriter.newLine();
			bufferedWriter.write("客户端:服务端的张三在吗?");
			bufferedWriter.newLine();
			bufferedWriter.flush();
			//3、获取写出流,PrintWriter实现
			PrintWriter sendToServerInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
			//PrintWriter.print 打印,PrintWriter.println 打印后终止该行,此行为一个文本行
			sendToServerInfo.println("客户端:我是客户端");
			sendToServerInfo.println("客户端:我是客户端的王五");
			sendToServerInfo.println("客户端:服务端的张三在吗?");
			sendToServerInfo.flush();
			
			//读取客户端反馈的信息
			while(acceptServerInfo.ready()){
				String line = acceptServerInfo.readLine();
				System.out.println(line);
			}

			sendToServerInfo.close();
			bufferedWriter.close();
			acceptServerInfo.close();
			socket.close();	
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
服务端代码:

package com.lcx.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {

	public static void main(String[] args) {
		/**
		 * 服务端
		 * 1、根据端口号(并不需要IP,本机就是服务端)创建ServerSocket对象
		 * 2、根据ServerSocket对象accept方法创建Socket对象
		 * 3、同客服端一样,根据socket对象获取读入流,获取服务端反馈的内容。将字节流转换成字符流,然后处理信息。
		 * 4、根据socket对象获取写出流,用于想服务端发送内容。同样将字节流转换成字符流,然后处理信息。
		 * 5、关流、关socket
		 */
		try {
			//1、创建ServerSocket对象
			ServerSocket serverSocket = new ServerSocket(6666);
			//2、根据ServerSocket对象创建Socket对象,等待客户端连接
			Socket socket = serverSocket.accept();
			//3、接受客户端信息
			BufferedReader acceptClientInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//4、给客户端信息
			PrintWriter sendToClientInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
			
			//读取客户端发来的信息
			while(acceptClientInfo.ready()){
				//读取一个文本行
				String info = acceptClientInfo.readLine();
				System.out.println(info);
			}
			//给客户端发信息
			sendToClientInfo.println("服务端:我是服务端的张三");
			sendToClientInfo.println("服务端:你是客户端的李四吗?");
			sendToClientInfo.flush();
			
			sendToClientInfo.close();
			acceptClientInfo.close();
			socket.close();
			serverSocket.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

简单推送消息结果截图:


服务端和客户端进行消息的相互推送

客服端代码

package com.lcx.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
 * 
 * @author
 */
public class SocketClient2 {
	public static void main(String[] args) {
		try {
			/**
			 * 回想下流的读入写出概念:
			 * 		如果是磁盘IO,那么何为读入?将磁盘内容读入到内存中。何为写出?将内存的内容写出到磁盘中持久化。
			 * 		如果是网络IO,那么何为读入?将网络传输的内容读入到内存中。何为写出?将内存的内容写出到网络传输中。
			 * 以InputStream/Reader结尾的一般是 读入字节/字符流。
			 * 以OutputStream/Writer结尾的一般是 写出字节/字符流。
			 * 主要步骤:
			 * 1、客户端根据服务器端IP地址和端口号获取socket对象。
			 * 2、根据socket对象获取读入流,获取服务端反馈的内容。将字节流转换成字符流,然后处理信息。
			 * 3、根据socket对象获取写出流,用于想服务端发送内容。同样将字节流转换成字符流,然后处理信息。
			 * 4、关流、关socket
			 * 用单线程实现客户端和服务端简单的消费推送
			 * 随后实现客户端和服务端进行通话
			 */
			System.out.println("-------------客户端界面------------------");
			//1、获取socket对象
			Socket socket = new Socket(InetAddress.getLocalHost(), 6666);
			//2、获取读入流
			BufferedReader acceptServerInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//3、获取写出流
			PrintWriter sendToServerInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
			
			//从控制台,输入消息和服务端对话,输入流
//			BufferedReader inputInfo = new BufferedReader(new InputStreamReader(System.in));
			Scanner inputInfo = new Scanner(System.in);
			while(true){
				//发送消息
//				String str = inputInfo.readLine();
				String str = inputInfo.nextLine();
				if("end".equals(str)){
					break;
				}
				System.out.println("客户端:"+str);
				sendToServerInfo.println("客户端:"+str);
				sendToServerInfo.flush();
				
				//接受消息
				String acStr = acceptServerInfo.readLine();
				System.out.println(acStr);
			}

			sendToServerInfo.close();
			acceptServerInfo.close();
			socket.close();	
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
服务端代码

package com.lcx.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class SocketServer2 {

	public static void main(String[] args) {
		/**
		 * 服务端
		 * 1、根据端口号(并不需要IP,本机就是服务端)创建ServerSocket对象
		 * 2、根据ServerSocket对象accept方法创建Socket对象
		 * 3、同客服端一样,根据socket对象获取读入流,获取服务端反馈的内容。将字节流转换成字符流,然后处理信息。
		 * 4、根据socket对象获取写出流,用于想服务端发送内容。同样将字节流转换成字符流,然后处理信息。
		 * 5、关流、关socket
		 */
		try {
			System.out.println("-------------服务端界面------------------");
			//1、创建ServerSocket对象
			ServerSocket serverSocket = new ServerSocket(6666);
			//2、根据ServerSocket对象创建Socket对象,等待客户端连接
			Socket socket = serverSocket.accept();
			//3、获取读入流
			BufferedReader acceptClientInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//4、获取写出流
			PrintWriter sendToClientInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
//			BufferedReader inputInfo = new BufferedReader(new InputStreamReader(System.in));
			Scanner inputInfo = new Scanner(System.in);
			while(true){
				//读取客户端信息
				String info = acceptClientInfo.readLine();
				System.out.println(info);
//				String str = inputInfo.readLine();
				String str = inputInfo.nextLine();
				if("end".equals(str)){
					break;
				}
				
				//给客户端发信息
				System.out.println("服务端:"+str);
				sendToClientInfo.println("服务端:"+str);
				sendToClientInfo.flush();
			}
			sendToClientInfo.close();
			acceptClientInfo.close();
			socket.close();
			serverSocket.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}
对话截图:



©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页