一、核心类
1. InetAddress:IP地址类
使用静态方法InetAddress.getByName(String s)创建,不能new。其中s可以是IP地址、域名或"localhost"。
2.Socket:套接字类
构造方法: new Socket(InetAddress inetAddress, int port);
3.URL:URL类
结构(协议://IP地址:端口/项目名/资源)
二、两种传输协议
1.TCP协议
传输前需要进行连接,采用客户端/服务器模式通信。
- 服务器端启动步骤:
- 创建socket打开本地端口:new ServerSocket(int port)
- 阻塞监听连接:socket.accept()
- 获得流:socket.getOutputStream()
- 关闭服务:outputStream.close();accept.close();socket.close();
- 客户端启动步骤:
- 创建socket指明服务器IP,端口号: new Socket(InetAddress inetAddress, int port)
- 获得流:socket.getInputStream()
- 关闭服务:inputStream.close();socket.close()
2.UDP协议
无需连接,尽最大可能交付,启动步骤如下:
- 建立socket,注明本机socket使用端口:new DatagramSocket(int port);
- 建立package(发送内容,起始下标,内容长度,目标IP,目标端口):new DatagramPackage(byte[] b,int off,int length,InetAddress inetAddress, int port)
- 发送package:package.send()
- 接收package(接收缓冲区,起始位置,内容长度):new DatagramPacket(byte[] b, int off, int package.getLength())
- 关闭socket:socket.close
三、示例
使用TCP协议下由客户端向主机发送消息
package CSTest;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Service {
public static void main(String[] args) throws Exception{
//启动服务器
ServerSocket serverSocket = new ServerSocket(9999);
//阻塞监听连接
Socket accept = serverSocket.accept();
//获取流
InputStream is = accept.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len;
while((len = is.read(b)) != -1){
baos.write(b,0,len);
}
System.out.println(baos.toString());
//关闭服务
baos.close();
is.close();
accept.close();
serverSocket.close();
}
}
package CSTest;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class Client{
public static void main(String[] args) throws Exception{
//创建连接socket
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 9999;
Socket socket = new Socket(inetAddress, port);
//发送消息
OutputStream os = socket.getOutputStream();
for (int i = 0; i < 2; i++) {
os.write("发送消息至服务器\n".getBytes(StandardCharsets.UTF_8));
}
os.close();
}
}
使用UDP协议多线程互发消息
package ChatTest;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
public class ChatClient01 {
public static int flag = 1;
public static void main(String[] args) throws Exception{
DatagramSocket socket = new DatagramSocket(6666);
//发送线程
Thread send = new Thread(()->{
String s = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(ChatClient01.flag == 1) {
try {
s = br.readLine();
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getByName("localhost"), 8888);
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}finally {
if(s.compareTo("bye") == 0){
ChatClient01.flag = 0;
socket.close();
break;
}
}
}
});
//接收线程
Thread receive = new Thread(()->{
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
String s = null;
while(ChatClient01.flag == 1){
try {
socket.receive(packet);
s = new String(packet.getData(), 0, packet.getLength());
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(ChatClient01.flag == 0){
break;
}
}
}
});
//打开线程
send.start();
receive.start();
}
}
本文介绍了Java中的网络编程基础知识,包括InetAddress、Socket和URL类的使用。详细阐述了TCP和UDP两种传输协议的工作原理,并提供了TCP协议下客户端向服务器发送消息的示例代码,以及UDP协议下多线程互发消息的示例代码。通过这些示例,读者可以深入理解Java网络编程的基本操作。
2514

被折叠的 条评论
为什么被折叠?



