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

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


首先看下通讯的流程。




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

先看图有个基本的了解:




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

先看客户端类:

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();来监听客户端的请求




发布了53 篇原创文章 · 获赞 4 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章