• 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();
    				}
    			}
    				
    		
    		}
    		
    	}
    }
    
    
  • 相关阅读:
    android创建自定义对话框
    激光裁剪的商务名片
    60个响应式的Web设计教程–能够手机访问!
    前端性能优化:使用Data URI代替图片SRC
    40个最好的Tumblr主题
    40个超酷的jQuery动画效果教程
    15个最好的jQuery timeline插件
    60+富有创意的宣传册设计
    Eclipse安装SVN
    EXPLAIN 关键字可以 查看 sql执行 的详细过程
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/6441622.html
Copyright © 2020-2023  润新知