【详细注释】Java->Socket 服务器与客户端的半双工通讯。拥有详细注释,完美诠释。

来源:互联网 发布:淘宝v2是什么意思 编辑:程序博客网 时间:2024/06/06 18:35

(客户端类)class Client:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;

public class Client {

public static void main(String[] args) {

try { 

//创建套接字;(作为客户端的水管头)连接服务器;

Socket s = new Socket("127.0.0.1", 50000);

Scanner sca = new Scanner(System.in);

//转换专用,将捕获的字节流转换为字符流(字节可以打包转字符,字符不能拆散转字节,可用强制转换失精度来理解)

OutputStreamWriter os = new OutputStreamWriter(s.getOutputStream());

//创建自符流对象来存取转换的字符流(容器)

PrintWriter pw = new PrintWriter(os);

//同上,转换专用,将要输入的字节流转换为字符流(扔进水管前打个包)

InputStreamReader is = new InputStreamReader(s.getInputStream());

//创建字符流,存放字符流

BufferedReader br = new BufferedReader(is);

//持续循环

while(true){

//创建 String 存放 br 读到的值

String str2 = br.readLine();

System.out.println("收到:"+str2);

System.out.print("(客户端)请输入内容:");

String str = sca.nextLine();

//写入文件(将要发送的 str 扔进水管)

pw.println(str);

//由于发送的是字符流,需要推动缓存(放入水管的是打包的东西,需要推一把)

pw.flush();

}

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}


(控制台类)class ServerMain:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

public class ServerMain {

public static void main(String[] args) {

try {

//创建 ss 服务器版的套接字(服务器比较高端,只要端口号就行)

ServerSocket ss = new ServerSocket(50000);

System.out.println("服务台上线");

String str0 = "我是服务器";

//创建 s 套接字,并在端口监听(为服务器干活的套接字,也高端,直接接通看到的管道就行)

Socket s = ss.accept();

System.out.println(s.getInetAddress()+"上线了");

Scanner sca = new Scanner(System.in);

//读取用的

//转换专用

InputStreamReader isr = new InputStreamReader(s.getInputStream());

//存放

BufferedReader br1 = new BufferedReader(isr);

//转换专用

OutputStreamWriter os = new OutputStreamWriter(s.getOutputStream());

//存放

PrintWriter pw = new PrintWriter(os,true);

while(true){

System.out.print("(服务器)请输入内容:");

//阻塞式进程,可以防止进入死循环

String str2 = sca.nextLine();

//写入

pw.println(str2);

//释放缓存

pw.flush();

String str1 = br1.readLine();

System.out.println("收到:"+str1);

}

catch (IOException e) {

e.printStackTrace();

}

}

}

阅读全文
0 0
原创粉丝点击