今天是 java 中 Socket 编程的第一课
在cmd 中运行 java.class 程序遇到点问题,之后改了环境变量就解决了在今后一周中,将初步实现 类似 QQ 聊天室的功能
思维导图:

Server.java 代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static int port = 3222;
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(port);//服务器端的 Socket port是端口
System.out.println("开始在"+ port +"端口启动服务器...");
String serverMsg="";//先定义服务器端的msg为空
Scanner sc = new Scanner(System.in);//输入
while(!"bye".equals(serverMsg)){//当服务器的msg不是bye的时候,执行以下操作
Socket socket = ss.accept();//socket 等待接收
System.out.println("链接已建立");
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); //Buffer存入缓存 inputStream是桥 socket.getInputStream是从对方获得输入流
/*
BufferedReader这个类就是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的
InputStreamReader 只是一个字符输入流,system.in是获取键盘输入而已
Socket 连接对象
给你个很形象的比喻
客户端 服务器端 本身是两台相对独立的计算机, 客户端打开一个端口, 服务器端通过IP 端口 在 客户端 与 服务器端 建立一条桥 Socket
双方通过这条桥实现数据的交换 socket 的 getinputstream 方法 就是从对方获得 输入流,返回一个inputstream 其实很简单啦,一个方法有一个返回值,
返回的对象就是inputstream 咯,呵呵 ,通过inputstream就可以在客户机上显示inputstream里面的信息了咯
*/
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//Buffer 是存入缓存,OutputStream是桥 getOutStream 是从对方得到数据
Thread tInput=new InputReader(input); //定义一个线程 等于新建的 InputReader类的一个对象
tInput.start();//运行线程,自动读取缓存的下一句话
//因为数据是存入缓存的,所以有延迟 当bye的时候执行的操作写在!bye里面,当线程读取下一句话的时候执行以下操作
while(("bye".equals(serverMsg))){ //当服务器的msg不是bye的时候,执行以下操作
serverMsg = sc.nextLine();//服务器msg是获取 扫描器的下一行
output.write(serverMsg +"\r\n");//output写入 servermsg
output.flush();
/*
flush() 是清空,而不是刷新啊。
一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,
因为还有一部分有可能会留在内存这个缓冲区中。这时候如果你调用了 close()方法关闭了读写流,那么这部分数据就会丢失,所以应该在关闭读写流之前先flush(),先清空数据。
*/
}
System.out.println("断开连接。。。");
socket.close();//这个连接的一端称为一个socket。Socket的英文原义是“孔”或“插座”。关闭连接
}
sc.close();//关闭扫描器
ss.close();//关闭数据连接1
} catch (IOException e) {
e.printStackTrace();
}
}
}


Client.java 代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("localhost", 3222);//建立连接
String serverMsg;
String clientMsg;//定义msg
Scanner sc = new Scanner(System.in);//扫描输入
clientMsg=sc.nextLine();//客户端msg是获得输入的内容
while(clientMsg != "bye"){ //当输入的不是bye的时候 执行以下操作
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));//Buffer是记录缓存 ,inputStream是桥,getInputStream 是得到对方的数据流
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
Thread tInput=new InputReader(input);//建立线程等于执行读取缓存的下一行的操作
tInput.start();//执行读取缓存的下一行的操作
output.write(clientMsg +"\r\n");//输出的内容写入缓存
output.flush();//清空缓存
serverMsg = input.readLine();//服务器msg 是读取得到对方流的内容的内容
System.out.println("server says : "+ serverMsg+ "\r\n");
clientMsg = sc.nextLine();//客户端的msg是扫描输入的内容
}
sc.close();//关闭扫描器
s.close();//关闭端口连接
} catch (IOException e) {
e.printStackTrace();
}
}
}

InputReader.java 代码
import java.io.BufferedReader;
class InputReader extends Thread{
BufferedReader br;//定义一个缓存功能
InputReader(BufferedReader br){ //构造函数,变量是br
this.br=br;
}
public void run(){ //运行
try { //try catch 是返回异常处理
while(true){ //当是true的时候
String msg=br.readLine(); //定义msg是自动读取缓存的下一行
System.out.println(msg);
}
} catch (Exception e) {
}
}
}
在 cmd 中运行实现:


作者: 聪聪工作室
业务合作: 18758171751
微信: 18758171751
Email: 1099749430@qq.com聪聪工作室---Java---独家制作
版权所有,盗版必究!
网友评论