您的位置:首页 > 理论基础 > 计算机网络

Java 基于 TCP/IP 实现 Socket中的多客户端通信

2016-01-31 15:36 1061 查看
使用多线程实现多客户端的通信功能, Client.java(客户端)同上一节中的一致,不需要修改

Server.java

package com.learn;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 基于TCP协议的Socket通信,实现用户登录
*
* 服务端
*/

public class Server {
public static void main(String[] args) {

Socket socket = null;
// 记录客户端数量
int count = 0;
try {
// 1.创建一个服务器端的 Socket,即 ServerSocket,指定绑定的端,并监听
ServerSocket server = new ServerSocket(8888);
// 2.调用 accept 方法开始监听,等待客户端连接
System.out.println("****服务器开始启动,等待客户端上线****");
// 循环监听客户端的连接
while (true) {
socket = server.accept();
// 创建一个新的线程
ServerThread st = new ServerThread(socket);
// 启动线程
st.start();

count++;// 客户端数量增加
System.out.println("客户端数量为:" + count);

InetAddress address = server.getInetAddress();
System.out.println("客户端IP:" + address.getHostAddress());
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


ServerThread .java

package com.learn;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/*
* 服务器端线程处理类
*/
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 {
// 3.获取一个输入流,用来读取客户端所发送的登录信息
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();// 关闭输入流

// 4.获取输出流
os = socket.getOutputStream();
pw = new PrintWriter(os);// 包装打印流
pw.write("好的,我收到消息了,你可以出去玩了");
pw.flush();
socket.shutdownOutput();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
// 5.关闭资源
if (pw != null)
pw.close();
if (br != null)
br.close();
if (isr != null)
isr.close();
if (is != null)
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

}


客户端,同上一节中的 Client.java 无需修改,同样需要先运行服务端,然后再运行客户端
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket java