实现采用客户/服务器通信模式,基于TCP网络通信协议的多客户端简单应用
2016-03-13 19:46
936 查看
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 案例介绍:
* 实现采用客户/服务器通信模式,
* 基于TCP网络通信协议的多客户端简单应用
* 案例设计:
* 1:服务器端通过ServerSocket的accept方法等待客户端链接的到来
* 2:客户端向服务端口发出TCP链接请求
* 3:服务器端accept方法接收请求,启动新线程处理与该客户端之间通信的通信,服务器端
* 主线程可继续等待客户端连续的请求。
*/
public class ChatServer {
public static void main(String[] args)throws IOException {
ServerSocket serverSocket=new ServerSocket(8888);
//先产生一个serverSocket,绑定一个端口
int number=1;//保存客户端的个数
while (true) {
Socket socket=serverSocket.accept();
System.out.println("客户端"+number+"连接成功!");
//服务端开启一个独立的线程来对客户端进行读写操作
new Thread(new ServerStream(socket, number)).start();
number++;
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/*
* 服务器端口为客户端产生一个线程
*/
public class ServerStream implements Runnable{
private Socket socket=null;
private int number;
//构造方法
public ServerStream(Socket socket, int number) {
super();
this.socket = socket;
this.number = number;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader
(new InputStreamReader(socket.getInputStream()));
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
while (true) {
String line=br.readLine();
System.out.println("客户端:"+number+":"+line);
pw.println(line.toUpperCase());
//把接收的字符串转换成大写的
if (line.equals("bye")) {
System.out.println("客户端"+number+"已经断开链接");
break;
}
}
br.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* 客户端与服务端的链接
*/
import java.io.IOException;
import java.net.Socket;
public class ChatClient {
public static void main(String[] args)throws IOException{
Socket socket=new Socket("127.0.0.1", 8888);//链接服务器,并发送端口号
new Thread(new ClientInputStream(socket)).start();
new Thread(new ClientOutputStream(socket)).start();
}
}
/*
* 客户端专门向服务端读的一个线程
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;
public class ClientInputStream implements Runnable{
private Socket socket=null;//要产生一个输入流就要先产生一个socket
//构造方法
public ClientInputStream(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader
(new InputStreamReader(socket.getInputStream() ));
while (true) {
try {
String line=br.readLine();
System.out.println(line);
} catch (SocketException e) {
break;
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* 客户端专门向服务端写的一个线程
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientOutputStream implements Runnable{
private Socket socket=null;
//构造方法
public ClientOutputStream(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
//自动刷新缓冲区
while (true) {
String line=br.readLine();
pw.println(line);
if (line.equals("bye")) {
break;
}
}
br.close();
pw.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.net.ServerSocket;
import java.net.Socket;
/*
* 案例介绍:
* 实现采用客户/服务器通信模式,
* 基于TCP网络通信协议的多客户端简单应用
* 案例设计:
* 1:服务器端通过ServerSocket的accept方法等待客户端链接的到来
* 2:客户端向服务端口发出TCP链接请求
* 3:服务器端accept方法接收请求,启动新线程处理与该客户端之间通信的通信,服务器端
* 主线程可继续等待客户端连续的请求。
*/
public class ChatServer {
public static void main(String[] args)throws IOException {
ServerSocket serverSocket=new ServerSocket(8888);
//先产生一个serverSocket,绑定一个端口
int number=1;//保存客户端的个数
while (true) {
Socket socket=serverSocket.accept();
System.out.println("客户端"+number+"连接成功!");
//服务端开启一个独立的线程来对客户端进行读写操作
new Thread(new ServerStream(socket, number)).start();
number++;
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/*
* 服务器端口为客户端产生一个线程
*/
public class ServerStream implements Runnable{
private Socket socket=null;
private int number;
//构造方法
public ServerStream(Socket socket, int number) {
super();
this.socket = socket;
this.number = number;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader
(new InputStreamReader(socket.getInputStream()));
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
while (true) {
String line=br.readLine();
System.out.println("客户端:"+number+":"+line);
pw.println(line.toUpperCase());
//把接收的字符串转换成大写的
if (line.equals("bye")) {
System.out.println("客户端"+number+"已经断开链接");
break;
}
}
br.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* 客户端与服务端的链接
*/
import java.io.IOException;
import java.net.Socket;
public class ChatClient {
public static void main(String[] args)throws IOException{
Socket socket=new Socket("127.0.0.1", 8888);//链接服务器,并发送端口号
new Thread(new ClientInputStream(socket)).start();
new Thread(new ClientOutputStream(socket)).start();
}
}
/*
* 客户端专门向服务端读的一个线程
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;
public class ClientInputStream implements Runnable{
private Socket socket=null;//要产生一个输入流就要先产生一个socket
//构造方法
public ClientInputStream(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader
(new InputStreamReader(socket.getInputStream() ));
while (true) {
try {
String line=br.readLine();
System.out.println(line);
} catch (SocketException e) {
break;
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* 客户端专门向服务端写的一个线程
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientOutputStream implements Runnable{
private Socket socket=null;
//构造方法
public ClientOutputStream(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(socket.getOutputStream(),true);
//自动刷新缓冲区
while (true) {
String line=br.readLine();
pw.println(line);
if (line.equals("bye")) {
break;
}
}
br.close();
pw.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
相关文章推荐
- HTTP协议
- 初识网络编程
- C++中STL迭代器的种类和简介http://blog.csdn.net/woshifeixingzhuiyue/article/details/7376308
- 一个 Http 请求
- 深入理解C++中的mutable关键字 http://no001.blog.51cto.com/1142339/389840/
- TCP粘包/拆包问题的解决
- TCP四次握手释放连接
- HTTP 2.0的那些事
- 模拟恶劣网络环境常用的几种解决方案
- C++模板之特化与偏特化详解 http://www.jb51.net/article/56004.htm
- Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧 http://www.cnblogs.com/kanego/archive/2012/08/15/2639761.htm
- HTTP stub_status 模块
- 图片url中包含中文导致网络请求404
- 函数模板(Function Template)及带默认参数的函数 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25520556&id
- 理解HTTP消息头 (四)
- 理解HTTP消息头 (三)
- 理解HTTP消息头 (二)
- 网络爬虫学习一
- 初识HTTP消息头
- 网络流学习笔记