step by step.
目录
一、 目的
二、 代码
1. 简单基础例子,深入理解(键盘输入,同意端口号,传递信息)
客户端:
服务端:
! Run:
!若客户端和服务端的端口号不同,则无法连接,更无法传输信息。
2. UDP
服务器:
客户端:
!监听端口和传输端口不能设置同一个端口号,功能不同,端口号不同。
一、 目的
1、了解网络协议的基本概念和区分 OSI 模型和 TCP/IP 模型的不同点。
2、熟悉输入输出流、以及常见的流处理工具。
3、掌握基于 TCP 编程和 UDP 编程的基本步骤和对相关核心类的了解。
4、掌握简单的应用服务器工作原理,为后面 Web 服务器开发打好基础。
二、 代码
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
接收成功!