网络编程
1.网络编程的定义
- 在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换
1.2 网络编程的三要素
- IP地址:计算机的标识符
- 端口:应用程序的标识符
- 协议:计算机之间连接和通信的规则
1.3 IP地址
1.4 Inet Address类
-
此类表示Internet协议(IP)地址
-
相关方法
方法名 | 说明 |
---|
static inetAddress getByName(String host) | 确定主机名称的ip地址 |
String getHostName() | 获取此IP地址的主机名 |
String getHostAddress() | 返回文本显示的IP地址字符串 |
示例
| package 网络编程; |
| |
| import java.net.InetAddress; |
| import java.net.UnknownHostException; |
| |
| public class Demo { |
| public static void main(String[] args) throws UnknownHostException { |
| |
| |
| InetAddress id = InetAddress.getByName("192.168.142.1"); |
| |
| |
| String hostName = id.getHostName(); |
| System.out.println(hostName); |
| |
| |
| |
| System.out.println(id.getHostAddress()); |
| |
| } |
| } |
| |

1.5 UDP和TCP协议
UDP
- 无连接通信协议,发送端和接收端不产生逻辑链接,发送端不会确认接收端的存在,发送数据报,接收端接收数据也不会有反馈
Tcp
2. java的UDP通信
方法名 | 说明 |
---|
DategramSocket() | 创建数据报文绑定到本地地址的任何可用端口 |
DategramPacket(byte[] buf,int length,InetAddress address,int port) | 构造一个数据包,发送长度为 length 的数据包到指定主机上的指定端口号。 |
方法名 | 说明 |
---|
void send(DatagramPacket p) | 发送数据报包 |
void close() | 关闭数据报套接字 |
void receive(DatagramPacket p) | 接收数据报包 |
发送数据
- 创建DategramSocket对象
- 创建数据,打包(DategramPacket)
- 调用DategramSocket的send方法
- 关闭发送端
| package 网络编程; |
| |
| import java.io.IOException; |
| import java.net.*; |
| |
| public class sendDemo { |
| public static void main(String[] args) throws IOException { |
| |
| DatagramSocket ds = new DatagramSocket(); |
| |
| |
| |
| byte []bys="hello world".getBytes(); |
| |
| |
| |
| DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("192.168.142.1"),12345); |
| |
| ds.send(dp); |
| |
| } |
| } |
| |
接收数据
方法名 | 说明 |
---|
DategramPacket(byte[] buf,int len) | 创建一个DategramPacket用于接收长度为len的数据包 |
方法名 | 说明 |
---|
byte[] getData() | 返回数据缓冲区 |
int getLength() | 返回要发送数据的长度或接收数据的长度 |
| package 网络编程; |
| |
| import java.io.IOException; |
| import java.net.DatagramPacket; |
| import java.net.DatagramSocket; |
| import java.net.SocketException; |
| |
| public class ReceiveDemo { |
| public static void main(String[] args) throws IOException { |
| |
| |
| DatagramSocket ds = new DatagramSocket(12345); |
| |
| |
| |
| byte[] bys = new byte[1024]; |
| |
| DatagramPacket dp = new DatagramPacket(bys,bys.length); |
| |
| |
| ds.receive(dp); |
| |
| System.out.println(new String(dp.getData(),0,dp.getLength())); |
| |
| |
| |
| ds.close(); |
| |
| } |
| } |
| |

接收和发送数据练习
-
接收端一直接收数据
-
发送端当键盘输入为886时停止发送
-
发送端
| package 网络编程.udp通信练习; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.net.DatagramPacket; |
| import java.net.DatagramSocket; |
| import java.net.InetAddress; |
| import java.net.UnknownHostException; |
| |
| public class SendDemo { |
| public static void main(String[] args) throws IOException { |
| |
| |
| |
| DatagramSocket ds = new DatagramSocket(); |
| |
| |
| |
| BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); |
| |
| String str; |
| |
| |
| |
| while((str=br.readLine())!=null){ |
| if(str.equals("886")){ |
| break; |
| }else{ |
| |
| |
| byte[] bys=str.getBytes(); |
| |
| DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("10.152.242.223"),12345); |
| |
| ds.send(dp); |
| |
| |
| } |
| } |
| |
| ds.close(); |
| |
| } |
| } |
| |
| package 网络编程.udp通信练习; |
| |
| import java.io.IOException; |
| import java.net.DatagramPacket; |
| import java.net.DatagramSocket; |
| |
| public class ReceiveDemo { |
| public static void main(String[] args) throws IOException { |
| |
| DatagramSocket ds = new DatagramSocket(12345); |
| |
| |
| |
| while(true){ |
| byte[] bys = new byte[1024]; |
| DatagramPacket dp = new DatagramPacket(bys,bys.length); |
| |
| |
| ds.receive(dp); |
| |
| |
| |
| System.out.println(new String(dp.getData(),0,dp.getLength())); |
| |
| } |
| |
| |
| |
| |
| } |
| } |
| |

3. java的TCP通信程序
- java为客户端提供了Socket类,为服务器提供了ServerSocket类
3.1 tcp发送数据
方法名 | 说明 |
---|
Socket(InetAddress address,int port) | 创建流套接字并将其连接到指定IP指定端口号 |
Socket(String host,int port) | 创建流套接字并将其连接到指定主机的指定端口号 |
方法名 | 说明 |
---|
InputStream getInputStream() | 返回此套接字的1输入流 |
OutputStream getOutputStream() | 返回此套接字的输出流 |
3.2 tcp接收数据(服务端)
方法名 | 说明 |
---|
ServletSocket(int port) | 创建绑定到指定端口的服务器套接字 |
方法名 | 说明 |
---|
Socket accept() | 监听要连接到此套接字并接收它 |
客户端
| package 网络编程.tcp通信; |
| |
| import java.io.IOException; |
| import java.io.OutputStream; |
| import java.net.Socket; |
| |
| public class ClientDemo { |
| public static void main(String[] args) throws IOException { |
| |
| Socket s = new Socket("10.152.242.223", 12345); |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| |
| |
| os.write("hello.world".getBytes()); |
| |
| s.close(); |
| |
| } |
| } |
| |
服务端
| package 网络编程.tcp通信; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| |
| public class ServerDemo { |
| public static void main(String[] args) throws IOException { |
| |
| |
| ServerSocket ss= new ServerSocket(12345); |
| |
| |
| |
| |
| |
| Socket s = ss.accept(); |
| |
| InputStream is = s.getInputStream(); |
| |
| byte[] bys = new byte[1024]; |
| int len; |
| while((len=is.read(bys))!=-1){ |
| String s1 = new String(bys, 0, len); |
| System.out.println("接收的数据为"+s1); |
| } |
| |
| s.close(); |
| ss.close(); |
| |
| } |
| } |
| |

3.3 tcp发送和接收数据(服务器有反馈)
| package 网络编程.tcp通信; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.net.Socket; |
| |
| public class ClientDemo { |
| public static void main(String[] args) throws IOException { |
| |
| Socket s = new Socket("10.152.242.223", 12345); |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| |
| |
| os.write("hello.world".getBytes()); |
| |
| |
| |
| |
| InputStream is = s.getInputStream(); |
| byte[] bys = new byte[1024]; |
| |
| int len; |
| len=is.read(bys); |
| System.out.println("服务器的反馈:"+new String(bys,0,len)); |
| s.close(); |
| |
| } |
| } |
| |
| package 网络编程.tcp通信; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| |
| public class ServerDemo { |
| public static void main(String[] args) throws IOException { |
| |
| |
| ServerSocket ss= new ServerSocket(12345); |
| |
| |
| |
| |
| |
| Socket s = ss.accept(); |
| |
| InputStream is = s.getInputStream(); |
| |
| byte[] bys = new byte[1024]; |
| int len; |
| len=is.read(bys); |
| String s1 = new String(bys, 0, len); |
| System.out.println("接收的数据为"+s1); |
| |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| os.write("数据已经接收".getBytes()); |
| |
| |
| s.close(); |
| ss.close(); |
| |
| } |
| } |
| |

3.4 tcp发送和接收数据(输入来自键盘输入)
| package 网络编程.tcp通信; |
| |
| import java.io.*; |
| import java.net.Socket; |
| |
| public class ClientDemo { |
| public static void main(String[] args) throws IOException { |
| |
| Socket s = new Socket("10.152.242.223", 12345); |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| |
| |
| |
| |
| BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); |
| BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); |
| |
| |
| String str; |
| while((str=br.readLine())!=null){ |
| |
| if(str.equals("886")){ |
| break; |
| }else{ |
| bw.write(str); |
| bw.newLine(); |
| bw.flush(); |
| } |
| } |
| |
| |
| |
| |
| InputStream is = s.getInputStream(); |
| byte[] bys = new byte[1024]; |
| |
| int len; |
| len=is.read(bys); |
| System.out.println("服务器的反馈:"+new String(bys,0,len)); |
| s.close(); |
| |
| } |
| } |
| |
| package 网络编程.tcp通信; |
| |
| import java.io.*; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| |
| public class ServerDemo { |
| public static void main(String[] args) throws IOException { |
| |
| |
| ServerSocket ss= new ServerSocket(12345); |
| |
| |
| |
| |
| |
| Socket s = ss.accept(); |
| |
| InputStream is = s.getInputStream(); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| BufferedReader br = new BufferedReader(new InputStreamReader(is)); |
| String str; |
| while((str=br.readLine())!=null){ |
| System.out.println(str); |
| } |
| |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| os.write("数据已经接收".getBytes()); |
| |
| |
| s.close(); |
| ss.close(); |
| |
| } |
| } |
| |

3.5 tcp发送和接收数据(都来自文件)
| package 网络编程.tcp通信; |
| |
| import java.io.*; |
| import java.net.Socket; |
| |
| public class ClientDemo { |
| public static void main(String[] args) throws IOException { |
| |
| Socket s = new Socket("10.152.242.223", 12345); |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| |
| |
| |
| |
| |
| BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); |
| |
| |
| |
| BufferedReader br = new BufferedReader(new FileReader("code\\13.txt")); |
| |
| |
| |
| String str; |
| while((str=br.readLine())!=null){ |
| |
| |
| |
| |
| bw.write(str); |
| bw.newLine(); |
| bw.flush(); |
| |
| } |
| |
| |
| |
| |
| InputStream is = s.getInputStream(); |
| byte[] bys = new byte[1024]; |
| |
| int len; |
| len=is.read(bys); |
| System.out.println("服务器的反馈:"+new String(bys,0,len)); |
| s.close(); |
| |
| } |
| } |
| |
| package 网络编程.tcp通信; |
| |
| import java.io.*; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| |
| public class ServerDemo { |
| public static void main(String[] args) throws IOException { |
| |
| |
| ServerSocket ss= new ServerSocket(12345); |
| |
| |
| |
| |
| |
| Socket s = ss.accept(); |
| |
| InputStream is = s.getInputStream(); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| BufferedReader br = new BufferedReader(new InputStreamReader(is)); |
| String str; |
| |
| |
| BufferedWriter bw = new BufferedWriter(new FileWriter("code\\14.txt")); |
| while((str=br.readLine())!=null){ |
| |
| bw.write(str); |
| bw.newLine(); |
| bw.flush(); |
| } |
| |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| os.write("数据已经接收".getBytes()); |
| |
| |
| s.close(); |
| ss.close(); |
| |
| } |
| } |
| |

3.6 客户端告知服务端传输完毕的方法
方法名 | 说明 |
---|
void shutdownInput() | 将此套接字的输入流放置在流的末尾 |
void shutdownOutput() | 禁止用此套接字的输出流 |
| package 网络编程.tcp通信; |
| |
| import java.io.*; |
| import java.net.Socket; |
| |
| public class ClientDemo { |
| public static void main(String[] args) throws IOException { |
| |
| Socket s = new Socket("10.152.242.223", 12345); |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| |
| |
| |
| |
| |
| BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); |
| |
| |
| |
| BufferedReader br = new BufferedReader(new FileReader("code\\13.txt")); |
| |
| |
| |
| String str; |
| while((str=br.readLine())!=null){ |
| |
| |
| |
| |
| bw.write(str); |
| bw.newLine(); |
| bw.flush(); |
| |
| } |
| |
| |
| s.shutdownOutput(); |
| |
| |
| |
| |
| InputStream is = s.getInputStream(); |
| byte[] bys = new byte[1024]; |
| |
| int len; |
| len=is.read(bys); |
| System.out.println("服务器的反馈:"+new String(bys,0,len)); |
| s.close(); |
| |
| } |
| } |
| |
| package 网络编程.tcp通信; |
| |
| import java.io.*; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| |
| public class ServerDemo { |
| public static void main(String[] args) throws IOException { |
| |
| |
| ServerSocket ss= new ServerSocket(12345); |
| |
| |
| |
| |
| |
| Socket s = ss.accept(); |
| |
| InputStream is = s.getInputStream(); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| BufferedReader br = new BufferedReader(new InputStreamReader(is)); |
| String str; |
| |
| |
| BufferedWriter bw = new BufferedWriter(new FileWriter("code\\14.txt")); |
| while((str=br.readLine())!=null){ |
| |
| bw.write(str); |
| bw.newLine(); |
| bw.flush(); |
| } |
| |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| os.write("数据已经接收".getBytes()); |
| |
| |
| s.close(); |
| ss.close(); |
| |
| } |
| } |
| |

3.7 为每个客户端都开启一个线程
| package 网络编程.tcp通信; |
| |
| import java.io.*; |
| import java.net.Socket; |
| |
| public class ClientDemo { |
| public static void main(String[] args) throws IOException { |
| |
| Socket s = new Socket("10.152.242.223", 12345); |
| |
| |
| |
| OutputStream os = s.getOutputStream(); |
| |
| |
| |
| |
| |
| BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); |
| |
| |
| |
| BufferedReader br = new BufferedReader(new FileReader("code\\13.txt")); |
| |
| |
| |
| String str; |
| while((str=br.readLine())!=null){ |
| |
| |
| |
| |
| bw.write(str); |
| bw.newLine(); |
| bw.flush(); |
| |
| } |
| |
| |
| s.shutdownOutput(); |
| |
| |
| |
| |
| InputStream is = s.getInputStream(); |
| byte[] bys = new byte[1024]; |
| |
| int len; |
| len=is.read(bys); |
| System.out.println("服务器的反馈:"+new String(bys,0,len)); |
| s.close(); |
| |
| } |
| } |
| |
| package 网络编程.tcp通信; |
| |
| import java.io.*; |
| import java.net.Socket; |
| |
| public class ServerThread implements Runnable{ |
| |
| private Socket s; |
| |
| public ServerThread(Socket s) { |
| this.s = s; |
| } |
| |
| @Override |
| public void run() { |
| |
| |
| BufferedReader br = null; |
| try { |
| br = new BufferedReader(new InputStreamReader(s.getInputStream())); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| |
| int count=20; |
| |
| File file = new File("code\\12" + count + ".txt"); |
| |
| while(file.exists()){ |
| count++; |
| file = new File("code\\12" + count + ".txt"); |
| } |
| |
| |
| BufferedWriter bw = null; |
| try { |
| bw = new BufferedWriter(new FileWriter(file)); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| |
| String str; |
| try{ |
| while((str=br.readLine())!=null){ |
| bw.write(str); |
| bw.newLine(); |
| bw.flush(); |
| } |
| |
| OutputStream os = s.getOutputStream(); |
| os.write("数据已经接收".getBytes()); |
| s.close(); |
| }catch (IOException e){ |
| e.printStackTrace(); |
| } |
| |
| |
| |
| |
| |
| } |
| |
| |
| |
| |
| } |
| |
| package 网络编程.tcp通信; |
| |
| import java.io.IOException; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| |
| public class ServerDemo2 { |
| public static void main(String[] args) throws IOException { |
| ServerSocket ss = new ServerSocket(12345); |
| |
| while(true){ |
| |
| |
| Socket s = ss.accept(); |
| |
| |
| |
| new Thread(new ServerThread(s)).start(); |
| } |
| } |
| } |
| |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!