【Java Socket】入门系列 3.3.通过 Socket 实现 TCP 编程 — 使用多线程实现多客户端通信
java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料
保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。
实现的基本步骤
服务器端创建ServerSocket,循环调用accpet(),等待客户端的连接客户端创建一个socket并请求和服务器端链接
服务器端接受客户端请求,创建sockcet 与客户端建立专线通信建立连接的两个socket在一个单独的线程上对话。
服务器继续等待新的链接。
代码Demo
1.建立服务器线程处理
1/**
* 服务器线程处理类
* @author DSD
*
*/
public class ServerThread extends Thread {
//和本线程相关的Socket
Socket socket = null;
public ServerThread(Socket socket)
{
this.socket = socket;
}
// 线程执行的操作,响应客户端的请求
public void run()
{
// 获取输入流,读取客户端信息
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
//获取输出流。响应客户端的请求
OutputStream os = null;
PrintWriter pw = 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();//刷新缓存
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
//关闭其他资源
try {
if(pw != null)
pw.close();
if(os != null)
os.close();
if(br != null)
br.close();
if(isr != null)
isr.close();
if(is != null)
is.close();
if(socket != null)
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2. 建立服务器端
1/**
* 基于TCP协议的Socket通信,实现用户登录
* 服务端
* @author DSD
*
*/
public class MServer {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
//记录客户端数量;
int count = 0;
System.out.println("****服务器即将启动,等待客户端链接****");
//循环监听等待客户端链接
while (true)//
{
//调用accept()方法开始监听,等待客户端的链接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("客户端的数量: "+count);
//获取客户端信息
InetAddress address = socket.getInetAddress();
System.out.println("当前客户端的IP: "+address.getHostAddress());
}
//上面将进行死循环,根本无法到达 关闭
//serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端代码
1/**
* Socket 客户端
* @author DSD
*
*/
public class MClient {
public static void main(String[] args) {
try {
//1.创建客户端Socket,指定服务器端口号和地址
Socket socket = new Socket("localhost",8888);//指定本地地址,端口号为8888
//2.获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
pw.write("用户名: tom;密码: 456 ");
pw.flush();
socket.shutdownOutput();//关闭输出流
//3.获取输入流,并读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) != null)
{
System.out.println("我是客户端,服务器说: "+info);
}
//4.关闭资源
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();
}
}
}
因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。
后续会有更多的精彩的内容分享给大家。
支付宝扫一扫
微信扫一扫
