socket编程三,实现多个客户端同时请求的一个服务端

在我的文章的socket编程二中虽然实现面向对象的编程的思想,但是还有一个致命的缺点,无法实现多用户同时请求,一旦出现多用户的时候,便会报错,所以下面再继续对socket二进行修改

第一步:再次新建一个 java project,再增加一个类,多线程类,重写父类的run方法,实现处理用户的请求,如下图所示

socket编程三,实现多个客户端同时请求的一个服务端_第1张图片

第二步:增加ServerThread类的代码如下:
package com.socket.Thread;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import com.socket.entity.User;

/**
 * 线程类
 * 
 * @author lfc
 * 
 */
public class ServerThread extends Thread {
	// 创建一个和本线程相关的socket
	Socket socket = null;
	//当创建一个线程的时候,创建一个socket
	public ServerThread(Socket socket){
		this.socket=socket;
		
		
	}
	//启动线程,重写父类的方法
	
	public void run(){

		System.out.println("服务器端准备好监听客户端的请求了。。。");
		try {
			
			// 3:获得输入流
			InputStream is = socket.getInputStream();
			// 包装下变成字符流,实现可以对对象进行反序列话操作
			ObjectInputStream ois=new ObjectInputStream(is);
			//创建输出流,用来给客户端提示的响应信息
			OutputStream os = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(os);
			// 4:读取对象,获得对象
			User user=(User)ois.readObject();
			System.out.println("编号:"+user.getId());
			System.out.println("年龄:"+user.getAge());
			System.out.println("姓名:"+user.getName());
			System.out.println("密码:"+user.getPassword());
			//给客户端的回应信息
			String response="客户端已经收到你们的信息了,Success";
			pw.write(response);
			pw.flush();
			// 5:关闭资源,注意,关闭的时候,要从底部开始往上依次关闭,顺序不能错!
			os.close();
			pw.close();
			ois.close();
			is.close();
			socket.close();

		} catch (IOException e) {

			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		}

		
	}

}




第三步,User类的代码请看前面的socket二中的代码,没有修改。


第四步,修改SocketServer的服务端的代码后如下:

package com.socket.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import com.socket.Thread.ServerThread;
import com.socket.entity.User;

/**
 * 服务器端
 * 
 * @author lfc 对于这个客户端以及服务端,运行的时候,必须先服务端开始运行起来,开始监听客户端的程序请求
 * 缺点:如果是登录程序中只能监听一个用户登录程序就会进入死亡转态了
 * 为了解决多用户能够同时进行请求,需要用多线程序来改造代码
 */
public class SocketServer {

	public static void main(String[] args) {
		
		
		try {
			// 1:创建一个服务端的ServerScoket,绑定端口开始监听
			ServerSocket serverScoket = new ServerSocket(8800);
			// 2:使用accept()方法阻塞等待连接,获得新的连接
			Socket socket = null;
			//加入一个统计来自客户端的请求的数目
			int num=0;
			//一直处于监听的运行转态
			while (true) {
				socket=serverScoket.accept();
				ServerThread serverThread=new ServerThread(socket);
				//启动线程
				serverThread.start();
				num++;
				System.out.println("客户端请求的次数为:"+num);
			}

		} catch (IOException e) {

			e.printStackTrace();
		}

		
	}

}




第五步:客户端的代码  loginClient代码没有修改,请查看前面的socket二中的客户端的代码:


第六步:运行服务器端的代码:如下图所示,服务器处于监听转态:


socket编程三,实现多个客户端同时请求的一个服务端_第2张图片

第七步,运行客户端的代码,如下图所示




第八步,此时再次查看服务器端打印出来的内容如下图所示:


socket编程三,实现多个客户端同时请求的一个服务端_第3张图片

第九步,我们修改客户端的User的名字为jack   密码也修改下,然后运行一次客户端的代码,再次查看服务器端的输出内容:



socket编程三,实现多个客户端同时请求的一个服务端_第4张图片


到此为止,我们就实现了利用socket面向对象编程,并且实现对用户同时发送请求,如果还想要好玩点,可以把服务器端的代码放到另外的一台电脑上运行,多个客户端在电脑上,同时发送请求,主要修改的地方时,客户端发送请求的ip要需改为对应服务器端电脑的ip地址即可。






你可能感兴趣的:(java,thread,多线程)