java实例练习——基于TCP/IP协议的多客户端通信

  先说一下大概的思路:

  应用多线程来实现服务器与多客户端之间的通信

  1、服务器端创建ServerSocket,循环调用accept()等待客户端连接;

  2、客户端创建一个Socket并请求与服务器端连接;

  3、服务器端接受客户端请求,创建Socket与该客户端简历专线连接;

  4、建立连接的两个Socket在一个单独的线程上对话;

  5、服务器端继续等待其他新的连接。

  闲话不多说,直接上代码:

package net;
/**
 * 1、客户端
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

	public static void main(String[] args) {
		
		try {
			//1、创建Socket,与服务器建立连接
			Socket socket = new Socket("localhost", 8889);			
			//2、向服务器端发送消息
			OutputStream os = socket.getOutputStream();			
			PrintWriter pwriter = new PrintWriter(os); //将Socket的输出字节流包装成打印流
			pwriter.write("用户名:sysker ;  密码:sys154");
			
			//刷新流
			pwriter.flush();
			//3、关闭资源
			socket.shutdownOutput();
			
			//3、获取输入流
			InputStream inputStream = socket.getInputStream();
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
			String getMsage=null;
			while((getMsage=bufferedReader.readLine())!=null){
				System.out.println("客户端正在等待响应,服务器说:"+getMsage);
				
			}	
			
			//socket.shutdownInput();
			bufferedReader.close();
			inputStream.close();
			inputStreamReader.close();
			pwriter.close();
			os.close();			
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

package net;
/**
 * 2、服务器端
 */

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ManyClientServer {

	public static void main(String[] args) {
		Socket socket = null;
		int clientCount = 0;
		try {
			ServerSocket serverSocket = new ServerSocket(8889);
			while(true){
				socket = serverSocket.accept();
				ManyClientThread manyClientThread = new ManyClientThread(socket);
				manyClientThread.start();
				clientCount++;
				System.out.println("客户端数量"+clientCount);
				System.out.println("客户端的IP地址:"+socket.getInetAddress().getHostAddress());
			}	
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

package net;
/**
 * 3、服务器通信线程
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ManyClientThread extends Thread{
	Socket socket = null;
	BufferedReader bufferedReader = null;
	public ManyClientThread(Socket socket){
		this.socket = socket;
	}
	public void run(){
		try {			
			BufferedReader bufferedReader = new BufferedReader(
					new InputStreamReader(socket.getInputStream()));
			String mString = null;
			while((mString = bufferedReader.readLine())!=null){
				System.out.println("我是服务器,客户端说"+mString);				
			}
			bufferedReader.close();
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(bufferedReader!=null){
				try {
					bufferedReader.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(socket!=null){
				try {
					socket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
				
		
		}
		
	}
}

原文地址:https://www.cnblogs.com/caoleiCoding/p/6441622.html