Java中利用socket实现简单的服务端与客户端的通信(基础级)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25352981/article/details/50040739

在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程。上一篇文章的链接:Java中利用socket实现简单的服务端与客户端的通信(入门级)

这次,我们将上一节中的代码进行少许的更改,将服务器更改为多线程,使得服务器可以为多个客户端服务。

因为是服务器端实现的多线程,所以客户端的代码不用做任何更改,和上一篇中的一样。只需要对服务端的代码进行稍许更改即可。

在项目中新建一个类,这个类就是线程类,所以要继承自Thread类,该类的代码如下:

package server_1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class MyThread extends Thread {
	//
	Socket socket=null;
	
	public MyThread(Socket socket) throws Exception{
		this.socket=socket;
	}
    public void run(){
    	BufferedReader in = null;  
    	try {
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //启动缓冲区 
        //out = new PrintWriter(client.getOutputStream());  
        while (true) {  
              String msg=null;
			try {
				msg = in.readLine();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} // 将客户端发送来的信息存储在msg中 
              System.out.println(msg);  
              if (msg.equals("shutdown")) {  //客户端如果发送的是shutdown,就关闭客户端
                    break;  
              }  
         }
         try {
			in.close();
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //执行相应的关闭操作         
    	
    }
    
    	
   
}
在上述代码中,MyThread的构造函数将socket传入类内部的socket中,同时,将通信的 主要任务都写在了这个线程类中。

以下是主类中的代码:

package server_1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class server_1 {  
	public static void main(String[] args) throws Exception { //将异常全部抛出 
        ServerSocket server = new ServerSocket(10000);    //用serversocket来启动服务器,并指定端口号
        System.out.println("服务器启动。。。");
        int count=0;
        while(true){
        	Socket socket = server.accept();  //获取客户端的socket信息
            MyThread mythread=new MyThread(socket);
            mythread.start();
            count++;
            System.out.println("客户端数量为:"+count);
        }
        //server.close();    
            //PrintWriter out = null;  
               
       //}      
    }  
}
可以看到,此次在服务端加了一个没有退出条件的循环操作,循环中监听网络中的socket信息,当有客户端连接的时候,就讲这个socket传给一个线程去执行,同时显示出目前连接到服务端的客户端的数量。

测试时,先运行服务端,然后打开两次客户端,分别像服务端发送数据,可以看到服务端可以显示出连接的客户端的数量,并且可以正常的显示客户端发送过来的数据。




2015年11月19日   西安交通大学



阅读更多

没有更多推荐了,返回首页