多线程服务器
应用多线程来实现服务器与多客户端之间的通信基本步骤
1、服务器端创建Serversocket,循环使用accept()等待客户端连接
2、客户端创建一个socket并请求和服务器端服务器连接
3、服务器端接受客户端请求,创建socket与该客户建立专线连接
4、建立连接的两个socket在一个单独的线程上对话
应用多线程来实现服务器与多客户端之间的通信基本步骤
1、服务器端创建Serversocket,循环使用accept()等待客户端连接
2、客户端创建一个socket并请求和服务器端服务器连接
3、服务器端接受客户端请求,创建socket与该客户建立专线连接
4、建立连接的两个socket在一个单独的线程上对话
5、服务器端继续等待新的链接
客户端
package com.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import org.omg.CORBA.portable.InputStream;
import org.omg.CORBA.portable.OutputStream;
/*
* 客户端
* 服务器端要先驱动
* */
public class Click {
public static void main(String[] args) {
try {
//创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost",8877);
java.io.OutputStream os = socket.getOutputStream();//字节流输出
PrintWriter pw = new PrintWriter(os);//将输出流包装为打印
pw.write("用户名:admin,密码:123456");
pw.flush();
socket.shutdownOutput();
//获取输入流,并读取服务器端的相应信息
java.io.InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info=br.readLine())!=null){
System.out.println("服务端说:"+info);
}
//关闭
br.close();
is.close();
pw.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 com.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import org.omg.CORBA.portable.InputStream;
import org.omg.CORBA.portable.OutputStream;
/*
* 服务器
* */
public class Server {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//创建一个服务器Socket,即ServerSocket,指定绑定端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8877);
System.out.println("***服务器即将启动,等待客户的链接***");
int count= 0;
while (true){
//调用accepy方法开始监听,等待客户的链接
Socket socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("count="+count);
}
//serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
线程控制类
package com.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
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 ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket){
this.socket=socket;
}
public void run(){
PrintWriter pw=null;
java.io.OutputStream os=null;
BufferedReader br=null;
InputStreamReader isr=null;
java.io.InputStream is=null;
try {
is = socket.getInputStream();
isr = new InputStreamReader(is);//将字节流转换成字符流
br = new BufferedReader(isr);
String info = null;
while ((info=br.readLine())!=null){
System.out.println("客户端说:"+info);
}
socket.shutdownInput();
//获取输出流,相应客户端的请求
os = socket.getOutputStream();
pw = new PrintWriter(os);//包装为打印流
pw.write("欢迎你!");
pw.flush();//调用flush()方法将缓冲输出
pw.close();
os.close();
is.close();
isr.close();
br.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}