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

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

2016-03-28 17:42 411 查看
其实网络编程时很重要的,当初我也没好好去学,现在也因为一直没接触到,也没想着去看,今天无聊,就闲着看了看。

首先看下通讯的流程。

接下来我们来简单实现一下:

先看图有个基本的了解:

接下来我们就用两个类简单模拟一下客户端与服务端:

先看客户端类:

Client:
package com.socket.demo;

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("用户名:admin; 密码:123456");
// 刷新缓存 ,发送请求
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("我是客户端,服务端说: " + 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:

package com.socket.demo;

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.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("*****  启动服务器,等待客户端的连接请求  ******");
Socket socket = serverSocket.accept();
// 接收输入流(字节流)
InputStream in = socket.getInputStream();
// 转换成字符流
InputStreamReader inputStreamReader = new InputStreamReader(in);
// 放入缓冲流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

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

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

socket.shutdownInput();
socket.shutdownOutput();
//  关闭流
bufferedReader.close();
inputStreamReader.close();
in.close();
socket.close();
serverSocket.close();
out.close();
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


再看看控制台的简单打印:

先看服务端的控制台:

在看看客户端的控制台:

这里值得注意的是,我们必须先启动服务端,客户端才能去请求。先启动服务端,然后通过serverSocket.accept();来监听客户端的请求
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: