网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个 socket。socket 也就是套接字,可以用来实现不同虚拟机或者不同计算机之间的通信。在 Java 语言中,socket 可以分为两种类型:面向连接的 socket 通信协议(TCP)和面向无连接的 socket 通信协议(UDP)。任何一个 socket 都是用 IP 地址与端口号唯一确定的。
基于 TCP 的通信过程如下:
首先,服务器端 Listen(监听)指定的某个端口是否有连接请求;其次,客户端想服务器端发出 Connect(连接) 请求;最后,服务器端向客户端返回 Accept(接受) 消息。一个连接就建立起来了,回话随即产生。服务器端与客户端都可以通过 Send,Write 等方法与对方通信。
Socket 的生命周期有三部分:打开 Socket,使用 Socket 收发的数据与关闭 Socket。在 Java 语言中,可以使用 ServerSocket 作为服务器端,Socket 作为客户端来实现网络通信。
这里我们为了简便,把客户端和服务器放到了一个包里面,最好是放在不同的工程里面!
首先我们来看服务器端的代码:
package 网络聊天;
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;
import java.util.Scanner;
public class L1{
public L1(){
try{
ServerSocket ss=new ServerSocket(9999);//设置服务器的端口
System.out.println("服务器正在监听");
Socket s=ss.accept();//只有服务器被客户连接之后,才会执行后面的语句
//System.out.println("22");//验证是否连接成功
InputStreamReader isr=new InputStreamReader(s.getInputStream());//接收客户端的数据
BufferedReader br=new BufferedReader(isr);//存入缓存
String xinxi=br.readLine();//读出
System.out.println(xinxi);//打印数据
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);//向客户端传数据
pw.println("我是服务器");//数据是啥
}catch(Exception e){
}
}
public static void main(String args[]){
L1 a=new L1();
}
}
注释比较详细,我就不一一解释了
然后是客户端的代码:
package 网络聊天;
import java.net.*;
import java.io.*;
public class L1_1 {
public static void main(String[] args){
L1_1 a=new L1_1();
}
public L1_1(){
try{
Socket s=new Socket("127.0.0.1",9999);//进入端口,前面是服务器的Ip,自己电脑一般是127.0.0.1,后面的是端口,与服务器对应
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);//IO流发送
pw.println("我是客户端");//发送的内容
//pw.flush();
//s.shutdownInput();
InputStream isr=s.getInputStream();//读取数据
BufferedReader br=new BufferedReader(new InputStreamReader(isr));//存到缓存区
String fanhui=br.readLine();//获取数据
System.out.println(fanhui);//输出数据
}catch(Exception e){
}
}
}
代码都写好之后呢,我们运行一个服务器的代码,启动服务器,console输出如下:
此时服务器正在监听,等待客户端的链接
然后我们运行客户端的代码,与服务器进行连接,此时服务器的终端显示为:
这个表示连接成功啦,服务器接收到了客户端发的数据,然后客户端的终端显示为:
这个表示客户端收到了服务器的数据啦!
还有一个要注意的地方就是我们运行客户端代码的时候,终端会自动切换为客户端的,这个时候要查看服务器的终端则需要切换终端,如上图,点击那个黑色下拉小三角就可以切换啦!
笔者当时运行时没看到服务器的数据输出可把我急坏了,当时一直以为是代码的问题,真的是心塞!!!
好啦,这次就到这里啦,有问题可以和我留言哦!
其他博客的链接:
Github个人网站 知乎
欢迎各位访问哦,这次就到这里啦!