zoukankan      html  css  js  c++  java
  • 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();
    				}
    			}
    				
    		
    		}
    		
    	}
    }
    
    
  • 相关阅读:
    C# Array.CreateInstance创建二维数组及如何遍历二维数组
    Camstar开发常用数据库表及其关联
    Camstar开发C#代码规范、Camstar更新以及Designer 开发规范
    Andorid存储方式---读写文件
    Andorid存储方式----SharedPreferences存储
    InputStream类只能读取一次
    ssh文件上传问题
    关于html自定义属性
    我是程序猿,我爱做菜。
    第8章 Spring Web Flow
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/6441622.html
Copyright © 2011-2022 走看看