java通信聊天室简单命令行版
2015-06-30 22:58
435 查看
解决思路
创建服务器端,将连接的客户端对应的Socket保存到列表中,接收到客户端消息后,转发给其他客户端。创建客户端,启动一个线程接收服务器端消息并输出,同时循环从键盘读取消息发送给给服务器端。
具体步骤
服务器端
创建ServerSocket,阻塞接受客户端请求,当连接建立是会产生一个和客户端对应的Socket,保存到静态列表中。public static List<Socket> socketList = new ArrayList<Socket>();
ServerSocket serverSocket = new ServerSocket(30000);
Socket socket = serverSocket.accept();
socketList.add(socket);
没建立一个链接就启动一个线程,并把当前Socket传入,此线程用来接收客户端消息并发送给其他客户端
public void run() { try { String line; //循环从Socket中读取客户端发来的数据 发送给所有客户端 while ((line = br.readLine()) != null) { for (Socket s : MyServer.socketList) { if (s != this.s) { PrintStream ps = new PrintStream(s.getOutputStream()); ps.println(line); } } } } catch (IOException e) { e.printStackTrace(); } }
客户端
新建Socket并指定地址指定端口Socket s = new Socket("127.0.0.1", 30000);
启动客户端线程,此线程用来接收服务器端消息并输出
new Thread(new ClientThread(s)).start();
BufferedReader循环读取键盘输入,通过PrintSream流输出给服务器端
//打开Socket对应的输出流 输送到服务器端 PrintStream ps = new PrintStream(s.getOutputStream()); String line = null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while ((line = br.readLine()) != null) { ps.println("有人说:"+line); }
效果如图
放马过来
服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class MyServer {
//对应客户端Socket列表
public static List<Socket> socketList = new ArrayList<Socket>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(30000);
while (true) {
Socket socket = serverSocket.accept();
socketList.add(socket);
new Thread(new ServerThread(socket)).start();
}
}
private static class ServerThread implements Runnable {
Socket s = null;
BufferedReader br = null;
public ServerThread(Socket socket) throws IOException {
this.s = socket;
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
}
public void run() { try { String line; //循环从Socket中读取客户端发来的数据 发送给所有客户端 while ((line = br.readLine()) != null) { for (Socket s : MyServer.socketList) { if (s != this.s) { PrintStream ps = new PrintStream(s.getOutputStream()); ps.println(line); } } } } catch (IOException e) { e.printStackTrace(); } }
}
}
客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class MyClient {
public static void main(String[] args) throws IOException {
Socket s = new Socket("127.0.0.1", 30000);
//启动客户端线程 接受服务器端消息并输出
new Thread(new ClientThread(s)).start();
//打开Socket对应的输出流 输送到服务器端 PrintStream ps = new PrintStream(s.getOutputStream()); String line = null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while ((line = br.readLine()) != null) { ps.println("有人说:"+line); }
}
private static class ClientThread implements Runnable {
Socket s = null;
BufferedReader br = null;
public ClientThread(Socket s) throws IOException {
this.s = s;
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
}
public void run() {
String line = null;
try {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
相关文章推荐
- Java 权限框架 Shiro 实战一:理论基础
- java的IO流来实现一个最简单的文件复制
- java构造器小结
- java集合
- Spring的IOC容器—Bean的自动装配
- 《Java程序设计》第17周课程设计:《猜猜看》游戏 第二天
- JavaSE学习笔记三
- java 打印99乘法表方式
- java web文件上传-无框架
- java常用集合
- java中的list集合
- JAVA “Run as administrator” “UAC disabled” alternative solution
- Java - JSON Data Operation
- 正则表达式,Java反射相关
- Eclipse插件-PatternBox
- spring+struts+hibernate
- java自带的MD5加密 以及jsMD5加密
- 如何理解: java的import ???
- 软件包javax.servlet不存在的解决办法
- javaweb——Filter(过滤器)学习