【Java】Socket编程之客户端和服务器相互通信(包含线程安全)

目录

一、非线程安全

       1). ClientSocket类

       2). ServerSocket类

二、线程安全

       1). ClientSocket类

       2). ServerSocket类

三、最终结果


一、非线程安全

1). ClientSocket类

public static final String IP_ADDR = "localhost";	//服务器地址   
public static final int PORT = 80;	//服务器端口号

public static void main(String[] args) throws IOException {
    //创建Socket连接对象
    Socket socket = new Socket(IP_ADDR,PORT);

    // 【向服务器发送信息】 —— 打开输出流(出)
    DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    System.out.print("【客户端】发送消息: ");    
    String clientStr = new BufferedReader(new InputStreamReader(System.in)).readLine();    
    out.writeUTF(clientStr);

    // 【接收服务器的响应信息】 —— 打开输入流(入)
    DataInputStream input = new DataInputStream(socket.getInputStream());    
    String ServerText = input.readUTF();     
    System.out.println("【客户端】获取响应消息: " + ServerText);   

    //关闭流
    out.close();
    input.close();   
}

2). ServerSocket类

public static final int PORT = 80;	//服务器端口号
public static final int TIME_OUT = 10*1000;	//连接超时时间

public static void main(String[] args) throws IOException {
    // 创建ServerSocket对象,监听指定端口的Socket的链接请求,并设置超时时间
    ServerSocket serverSocket = new ServerSocket(PORT);
    serverSocket.setSoTimeout(TIME_OUT);

    // 采用循环不断地接收来自客户端的请求
    while(true){
        // 每当接收客户端Socket请求时,服务器端产生一个对应的Socket对象
        Socket socket = serverSocket.accept();

        // 【接收客户端数据】 —— 打开输入流(入)
        DataInputStream input = new DataInputStream(socket.getInputStream());
        String clientInputStr = input.readUTF();
        System.out.println("【服务器】接收消息:" + clientInputStr); 

        // 【响应客户端】 —— 打开输出流(出)
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());    
        System.out.print("【服务器】响应消息: ");    
        String ServerOutputStr = new BufferedReader(new InputStreamReader(System.in)).readLine();    
        out.writeUTF(ServerOutputStr); 
 
        //关闭流
        out.close();
        input.close();    
    }
}

二、线程安全

1). ClientSocket类

public static final String IP_ADDR = "localhost";	//服务器地址   
public static final int PORT = 80;	//服务器端口号    
public static void main(String[] args){
    	System.err.println("启动客户端...");
    	Socket socket = null;
    	try{
    	// 创建流套接字对象并将其连接到指定主机上的指定端口号 
    	    	socket = new Socket(IP_ADDR,PORT);
        	// 【向服务器发送信息】 —— 打开输出流(出)
	    	DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    	System.out.print("【客户端】发送消息: ");    
	    	String clientStr = new BufferedReader(new InputStreamReader(System.in)).readLine();    
	    	out.writeUTF(clientStr);
	    	// 【接收服务器的响应信息】 —— 打开输入流(入)
	    	DataInputStream input = new DataInputStream(socket.getInputStream());    
	    	String ServerText = input.readUTF();     
	    	System.out.println("【客户端】获取响应消息: " + ServerText);   
	    	//关闭流
	    	out.close();
	    	input.close();  
    	} catch (Exception e) {  
    		System.err.println("客户端异常:" + e.getMessage());   
    	} finally {  
	    	if (socket != null) {  
	    		try {  
	    			socket.close();  
		    	} catch (IOException e) {  
    	socket = null;   
		    		System.err.println("客户端 finally 异常:" + e.getMessage());   
            	 }
	    	}
    	}
}

2). ServerSocket类

public static final int PORT = 80; // 服务器端口号
public static final int TIME_OUT = 15 * 1000; // 连接超时时间
public static void main(String[] args) {
	System.err.println("启动服务器...");
	KeTangServer server = new KeTangServer();
	server.start();
}
public void start() {
	try {
		// 创建ServerSocket对象,监听指定端口的Socket的链接请求,并设置超时时间
		ServerSocket serverSocket = new ServerSocket(PORT);
		serverSocket.setSoTimeout(TIME_OUT);
		while (true) {
			// 一旦有堵塞, 则表示服务器与客户端获得了连接
			Socket client = serverSocket.accept();
			// 处理这次连接
			new HandlerThread(client);
		}
	} catch (Exception e) {
		System.err.println("服务器异常: " + e.getMessage());
	}
}
private class HandlerThread implements Runnable {
	private Socket socket;	//Socket对象
	public HandlerThread(Socket client) {
		socket = client;
		new Thread(this).start();
	}
	public void run() {
		try {
			// 【接收客户端数据】 —— 打开输入流(入)
			DataInputStream input = new DataInputStream(socket.getInputStream());
			String clientInputStr = input.readUTF();
			System.out.println("【服务器】接收消息:" + clientInputStr);
			// 【响应客户端】 —— 打开输出流(出)
			DataOutputStream out = new DataOutputStream(socket.getOutputStream());
			System.out.print("【服务器】响应消息: ");
			String ServerOutputStr = new BufferedReader(new InputStreamReader(System.in)).readLine();
			out.writeUTF(ServerOutputStr);
			// 关闭流
			out.close();
			input.close();
		} catch (Exception e) {
			System.err.println("服务器run异常: " + e.getMessage());
		} finally {
			if (socket != null) {
				try {
					socket.close();
				} catch (Exception e) {
					socket = null;
					System.err.println("服务端finally异常:" + e.getMessage());
				}
			}
		}
	}
}

三、最终结果

猜你喜欢

转载自blog.csdn.net/Rao_Limon/article/details/89947605