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

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

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

[img]http://dl2.iteye.com/upload/attachment/0120/7661/9c0f5836-1647-3a3b-9471-1847ff21ebac.png[/img]

[b]第二步:增加ServerThread类的代码如下:[/b]

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();
}


}

}




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


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


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();
}


}

}




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

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


[img]http://dl2.iteye.com/upload/attachment/0120/7663/9256c18c-7007-3a94-9a0d-1e9834f4260b.png[/img]
[b]
第七步,运行客户端的代码,如下图所示
[/b]

[img]http://dl2.iteye.com/upload/attachment/0120/7665/86f3d8d0-a92d-3f1f-9953-cf9e32bc8346.png[/img]

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


[img]http://dl2.iteye.com/upload/attachment/0120/7667/a446fe2a-474d-3341-8c30-9848edc4de18.png[/img]

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


[img]http://dl2.iteye.com/upload/attachment/0120/7671/522a314f-b90d-35ed-813e-28f4c26f81c8.png[/img]


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

你可能感兴趣的:(java基础)