多个客户端与一个服务器端通信的问题
上篇博文主要是讲的关于客户端与服务器端的通信问题,在上篇博文中当我们只有一个客户端访问我们的服务器时是可以正常运行的,但是当我们有多个客户端访问我们的服务器时,我们的代码就不能正常工作了。
而在现实中,我们是很少有一个服务器只供一个客户端访问的,此篇博文就是来解决多个客户端访问我们服务器端的问题。
解决方法:
- 用一个多线程就可以解决
实现代码如下:
第一个:客户端的代码如下:
package org.wrh.socketserver;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class MyClient {
public static void main(String[] args) throws Exception {
//第一步:创建客户端Socket
Socket s=new Socket("192.168.1.107",4567);
//第二步:读取向服务器端发送的数据文件
FileInputStream fis=new FileInputStream("d:\\100.txt");
//第三步:获取Socket输出流
OutputStream os=s.getOutputStream();
byte[] buf=new byte[1024];
int len;
while((len=fis.read(buf))!=-1){
os.write(buf, 0, len);
}
//刷新一下缓冲区的数据
os.flush();
//告诉服务器,我的数据已经发送完了
s.shutdownOutput();
//将服务器返回的数据读取出来
InputStream is=s.getInputStream();
byte[] buf_in=new byte[1024];
int len_in=is.read(buf_in);
System.out.println(new String(buf_in,0,len_in));
fis.close();
os.close();
is.close();
s.close();
}
}
第二个:服务器端的代码如下
package org.wrh.socketserver;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) throws Exception {
//第一步:建立服务器端Socket
ServerSocket ss=new ServerSocket(4567);
while(true){
//第二步:获取客户端
Socket socket=ss.accept();
/* * 当我们考虑多个客户端访问服务器端的时候,我们就需要考虑多线程的问题 * */
new Thread(new TaskWork(socket)).start();
}
}
}
其中,线程类的代码如下
package org.wrh.socketserver;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TaskWork implements Runnable {
Socket socket;
public TaskWork(Socket socket){
this.socket=socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
int count=0;
/* * 获取客户端的ip地址 * */
String ip=socket.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//第三步:获取Socket的输入流,对客户端发送来的数据进行读取
try{
InputStream is=socket.getInputStream();
/* *读取数据,并 将数据写入到文件中 * */
File dir=new File("d:\\wu");
if(!dir.exists()){
dir.mkdirs();
}
File file=new File(dir,ip+".txt");
/* * 如果在服务器端此文件已经存在的处理办法 * */
if(file.exists()){
file=new File(dir,ip+"("+(++count)+").txt");
}
FileOutputStream fos=new FileOutputStream(file);
byte[] buf=new byte[1024];
int len=0;
while((len=is.read(buf))!=-1){
fos.write(buf, 0, len);
}
fos.flush();
//给客户端一个反馈信息
OutputStream os=socket.getOutputStream();
os.write("收到数据".getBytes());
//下面为关闭各种要关闭的资源
fos.close();
is.close();
os.close();
socket.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
如果上篇博文的代码你弄懂了,这篇博文的代码理解起来就相当容易啦
说明
- 上面的代码中,主线程一直在等待这客户端的连接,只要一有客户端连接进来,就会开启一个子线程来执行相应的操作。