step by step.
目录
1. 简单基础例子,深入理解(键盘输入,同意端口号,传递信息)
!若客户端和服务端的端口号不同,则无法连接,更无法传输信息。
!监听端口和传输端口不能设置同一个端口号,功能不同,端口号不同。
一、 目的
2.1、Server端需要做的事情
创建一个ServerSocket,绑定对象监听端口,因为0~1023之间的端口大部分分配给电脑设备了,因此我们随机分配一个1024~635535之间的端口。
通过ServerSocket.accept()监听Client端的请求,等待客户端与之通信
通过输入流读取客户端发送的信息请求,读取完成以后使用Socket.shutdownOutput()关闭输出流
通过输出流向客户端发送响应信息,输出流完成时需要执行flush方法和Socket.shutdownInput()关闭输入流
关闭InputStream、OutputStream、ServerSocket、Socket占用的资源。
2.2、Client端需要做的事情
创建Socket,指定我们要连接的远程Server的IP地址和端口号
通过输入流向Server端发送信息,并执行flush()方法,然后调用Socket.shutdownInput()
通过输出流读取Server端传输过来的信息,执行完以后调用Socket.shutdownOutput();
最后释放所有的资源,InputStream、OutputStream、Socket。
————————————————
版权声明:本文为CSDN博主「markliwei1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/makeliwei1/article/details/81666941
二、 代码
1. 简单基础例子,深入理解(键盘输入,同意端口号,传递信息)
客户端:
package basic;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
/**
* @Author: y9
* @Date: 2021/10/22
* @Description: 客户端程序
**/
public class EchoClient {
private static final BufferedReader KEYBOARD_INPUT = new BufferedReader(
new InputStreamReader(System.in)
);
public static String getString(String prompt) throws Exception { //键盘信息
System.out.print(prompt);
String str = KEYBOARD_INPUT.readLine();
return str;
}
public static void main(String[] args) throws Exception{
Socket client = new Socket("localhost",9999); //定义服务器的连接信息
Scanner scan = new Scanner(client.getInputStream());
scan.useDelimiter("\n");
PrintStream out = new PrintStream(client.getOutputStream());
boolean flag = true;
while(flag){
String input = getString("请输入要发送的内容").trim();
out.println(input);
if(scan.hasNext()){ //服务端有回应
System.out.println(scan.next()); //获取接收内容
}
if("byebye".equalsIgnoreCase(input)){
flag=false;
}
}
scan.close();
out.close();
client.close();
}
}
服务端:
package basic;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* @Author: y9
* @Date: 2021/10/22
* @Description: 服务器程序
**/
public class EchoServr {
//服务器
public static void main(String[] args) throws Exception{
ServerSocket server = new ServerSocket(9999); //服务监听端口
System.out.println("等待客户端连接……");
Socket client = server.accept(); //等待客户端连接,需要RUN服务端程序
System.out.println("成功连接……");
Scanner scan = new Scanner(client.getInputStream());//接受客户端输入流,决定于客户端(此客户端设置为键盘输入)
scan.useDelimiter("\n"); //设置分隔符为回车(回车表示此消息结束,获取下一消息)
PrintStream out = new PrintStream(client.getOutputStream());
//即将从客户端获取的信息流
boolean flag = true;
while(flag){
if(scan.hasNext()){ //有数据接收
String val = scan.next().trim(); //获取接收内容
if("byebye".equalsIgnoreCase(val)){ //结束标记
out.println("Byebyebye");
System.out.println("结束。^ ^");
flag = false;
}else{
out.println("【echo】"+val); //回应信息
System.out.println("服务端接收到:"+val);
}
}
}
scan.close();
out.close();
client.close();
server.close();
}
}
! Run:
先启动客户端,显示:
等待客户端连接……
然后启动服务端,显示:
等待客户端连接……
成功连接……
在客户端传入信息(键盘),显示:
请输入要发送的内容123
【echo】123
请输入要发送的内容456
【echo】456
请输入要发送的内容byebye
Byebyebye
Process finished with exit code 0
服务端接收信息的同时,显示:
等待客户端连接……
成功连接……
服务端接收到:123
服务端接收到:456
结束。^ ^
Process finished with exit code 0
!若客户端和服务端的端口号不同,则无法连接,更无法传输信息。
2. UDP
服务器:
package basic;
import javax.xml.crypto.Data;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
/**
* @Author: y9
* @Date: 2021/10/22
* @Description: UDP服务端
**/
public class UDPServer {
public static void main(String[] args) throws Exception{
DatagramSocket server = new DatagramSocket(9998); //不能再用9990,否则报错
String str = "www.scau.edu.cn";
DatagramPacket packet = new DatagramPacket(str.getBytes(),0,str.length(),
InetAddress.getByName("localhost"),9990); //发送端口,如果与客户端的不同,则接收不到。
server.send(packet);
System.out.println("消息发送完毕……");
server.close();
}
}
客户端:
package basic;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @Author: y9
* @Date: 2021/10/22
* @Description: UDP客户端
**/
public class UDPClient {
public static void main(String[] args) throws Exception{
//接收数据信息
DatagramSocket client = new DatagramSocket(9990); //9990端口监听
byte data[] = new byte[1024]; //保存接收数据
DatagramPacket packet = new DatagramPacket(data,data.length); //创建数据报
System.out.println("客户端等待接收发送的信息……");
client.receive(packet);
System.out.println("接受到的消息内容为:"+ new String(data,0,packet.getLength()));
client.close();
}
}
启动服务器,显示:
消息发送完毕……
启动客户端,显示:
客户端等待接收发送的信息……
接受到的消息内容为:www.scau.edu.cn
接收成功!