网络编程:server服务器转发消息,多个客户端实现群聊
2016-07-27 11:04
666 查看
依然直接上图:
下面是代码实现:
Client.java
<span style="font-size:18px;">import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
*
* @author 周孟军 时间:2016年7月27日 上午10:00:41
*
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s = new Socket("127.0.0.1", 1099);
Read r = new Read(s);
r.start();
new Write(s).start();
}
}</span>
Server.java
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 java.util.ArrayList;
import java.util.List;
/**
* 服务器端
*
* @author 周孟军 时间:2016年7月27日 上午9:59:25
*
*/
public class Server {
public static void main(String[] args) throws IOException {
List<Task> list = new ArrayList<>();
ServerSocket ss = new ServerSocket(1099);
System.out.println("服务器已启动---->");
while (true) {
Socket s = ss.accept();
System.out.println(s.getInetAddress() + "用户接入");
Task t = new Task(s, list);
list.add(t);
t.start();
}
}
}
class Task extends Thread {
Socket s;
List<Task> clients;
public Task(Socket s, List<Task> clients) {
super();
this.s = s;
this.clients = clients;
}
@Override
public void run() {
while (true) {
try {
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
String str = br.readLine();
// 转发消息
for (Task task : clients) {
PrintWriter pw = new PrintWriter(task.s.getOutputStream());
pw.println(str);
pw.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Read.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
public class Read extends Thread {
Socket s;
public Read(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
while (true) {
try {
// 不停的接收消息
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Write.java
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Write extends Thread {
Socket s;
public Write(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
while (true) {
try {
PrintWriter pw = new PrintWriter(s.getOutputStream());
Scanner can = new Scanner(System.in);
pw.println("---> " + can.nextLine());
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
完工!
下面是代码实现:
Client.java
<span style="font-size:18px;">import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
*
* @author 周孟军 时间:2016年7月27日 上午10:00:41
*
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s = new Socket("127.0.0.1", 1099);
Read r = new Read(s);
r.start();
new Write(s).start();
}
}</span>
Server.java
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 java.util.ArrayList;
import java.util.List;
/**
* 服务器端
*
* @author 周孟军 时间:2016年7月27日 上午9:59:25
*
*/
public class Server {
public static void main(String[] args) throws IOException {
List<Task> list = new ArrayList<>();
ServerSocket ss = new ServerSocket(1099);
System.out.println("服务器已启动---->");
while (true) {
Socket s = ss.accept();
System.out.println(s.getInetAddress() + "用户接入");
Task t = new Task(s, list);
list.add(t);
t.start();
}
}
}
class Task extends Thread {
Socket s;
List<Task> clients;
public Task(Socket s, List<Task> clients) {
super();
this.s = s;
this.clients = clients;
}
@Override
public void run() {
while (true) {
try {
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
String str = br.readLine();
// 转发消息
for (Task task : clients) {
PrintWriter pw = new PrintWriter(task.s.getOutputStream());
pw.println(str);
pw.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Read.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
public class Read extends Thread {
Socket s;
public Read(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
while (true) {
try {
// 不停的接收消息
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Write.java
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Write extends Thread {
Socket s;
public Write(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
while (true) {
try {
PrintWriter pw = new PrintWriter(s.getOutputStream());
Scanner can = new Scanner(System.in);
pw.println("---> " + can.nextLine());
pw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
完工!
相关文章推荐
- 网络中的基本概念
- (POJ3469)Dual Core CPU 网络流最小割,Dinic模板应用
- IOS检测是否有网络
- 神经网络的梯度下降法
- 网络编程_java.net.InetAddress类的使用
- 【技术晨读】TCP慢启动、拥塞避免、快速重传、快速恢复
- HTTP缓存控制小结
- 为什么获取的System.Web.HttpContext.Current值为null,HttpContext对象为null时如何获取程序(站点)的根目录
- HTTP协议状态码详解(HTTP Status Code)
- TCP协议: SYN ACK FIN RST PSH URG 详解
- HTTP的通信的 发送请求、接收响应 包含哪些内容?OC中是怎样实现的?
- TCP/IP
- #HTTP学习笔记01-URL
- HTTP四种常见的POST提交数据方式
- HTTP学习笔记01-URL
- [转]HTTP 头部详细解释
- iOS开发网络篇—GET请求和POST请求
- Apache中Httpd.conf详解(一)
- Apache中Httpd.conf详解(二)
- httpClient(Get)解析JSON