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

基于TCP实现简单的客户端服务端的消息传递(二)

2016-03-29 14:55 796 查看
上一节学习了TCP与客户端的通讯及数据交互,但是仅限于一次客户端,这一节学习使用线程来模拟多客户端请求一个服务端。

首先看代码:

先看客户端:

Client.java

这里我们模拟了两个客户端

package com.socket.tcp;

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;
import java.net.UnknownHostException;

/**
* 客户端
* @author lolli
*
*/
public class Client {

public static void main(String[] args) {

try {
//  实例化一个Socket,请求8888端口
Socket socket = new Socket("localhost", 8888);

// 获取一个输出流像服务端发送消息

OutputStream outputStream = socket.getOutputStream();

PrintWriter out = new PrintWriter(outputStream);

out.write("我是客户端1");
// 刷新缓存 ,发送请求
out.flush();

socket.shutdownOutput();

// 获取一个输入流,接受服务端的响应

InputStream in = socket.getInputStream();
// 转换成字符流
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 放入缓冲流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

// 获取客户端请求的数据
String str = "";
while((str = bufferedReader.readLine())!=null){
// 打印客户端请求的数据
System.out.println("我是客户端1,服务端说: " + str);
}

socket.shutdownInput();

// 关闭流
out.close();
outputStream.close();
socket.close();

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

}
}


package com.socket.tcp;

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;
import java.net.UnknownHostException;

/**
* 客户端
* @author lolli
*
*/
public class Client2 {

public static void main(String[] args) {

try {
//  实例化一个Socket,请求8888端口
Socket socket = new Socket("localhost", 8888);

// 获取一个输出流像服务端发送消息

OutputStream outputStream = socket.getOutputStream();

PrintWriter out = new PrintWriter(outputStream);

out.write("我是客户端2");
// 刷新缓存 ,发送请求
out.flush();

socket.shutdownOutput();

// 获取一个输入流,接受服务端的响应

InputStream in = socket.getInputStream();
// 转换成字符流
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 放入缓冲流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

// 获取客户端请求的数据
String str = "";
while((str = bufferedReader.readLine())!=null){
// 打印客户端请求的数据
System.out.println("我是客户端2,服务端说: " + str);
}

socket.shutdownInput();

// 关闭流
out.close();
outputStream.close();
socket.close();

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

}
}


再看看服务端的实现:

server.java:

package com.socket.tcp;

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

/**
* 服务端
* @author lolli
*
*/
public class Server {

public static void main(String[] args) {

try {
// 实例化一个ServerSocket,监听8888端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("*****  启动服务器,等待客户端的连接请求  ******");

int clientCount = 0;
while(true){
Socket socket = serverSocket.accept();
// 获取一个服务端线程
ServerThread serverThread = new ServerThread(socket);
// 启动线程
serverThread.start();
clientCount ++ ;
System.out.println("当前连接服务端的客户端数量:" + clientCount);

InetAddress inetAddress = socket.getInetAddress();
System.out.println("当前连接的计算机名:" + inetAddress.getHostName());

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

}
}


在这里我们有一个ServerThread的实现,我们也来看看。

ServerThread.java:

package com.socket.tcp;

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;

/**
* 服务端线程类
* @author lolli
*
*/
public class ServerThread extends Thread{

private Socket socket = null;
// 有参构造
public ServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
InputStream in = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
OutputStream outputStream = null;
PrintWriter out = null;
try {
// 接收输入流(字节流)
in = socket.getInputStream();
// 转换成字符流
inputStreamReader = new InputStreamReader(in);
// 放入缓冲流
bufferedReader = new BufferedReader(inputStreamReader);

// 获取客户端请求的数据
String str = "";
String data = "";
while((str = bufferedReader.readLine())!=null){
// 打印客户端请求的数据
System.out.println("我是服务端,客户端说: " + str);
data = str;
}

// 接收到客户端请求的数据后相应客户端
outputStream = socket.getOutputStream();
out = new PrintWriter(outputStream);
out.write("接收到了客户端传递的数据,数据为:‘" + data + "’");
out.flush();

socket.shutdownInput();
socket.shutdownOutput();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//  关闭流
try {
if (bufferedReader!=null)
bufferedReader.close();
if (inputStreamReader!=null)
inputStreamReader.close();
if (in!=null)
in.close();
if (socket!=null)
socket.close();
if (out!=null)
out.close();
if (outputStream!=null)
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
}


首先我们看看运行的效果:

首先我们启动服务端,

然后启动客户端1

服务端控制台:

客户端1控制台:

接下来我们再启动客户端2,再看看效果:

服务端控制台:

客户端2控制台:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: