JAVA网络编程【基于TCP和UDP协议】超详细!!!
ip地址:唯一标识主机的地址
端口号:用于标识计算机上某个特定的网络程序
InetAddress类
方法 | 说明 |
---|---|
InetAddress InetAddress.getLocalHost() | 静态方法,获取本机InetAddress对象(主机名+ip地址) |
InetAddress InetAddress.getByName("主机名") | 根据主机名或者域名获取ip地址对象(主机名+ip地址)/(域名+ip地址) |
getHostName | 获取InetAddress对象的主机名 |
getHostAddress | 获取InetAddress对象的地址 |
InetSocketAddress抽象基类,子类SocketAddress
构造方法
public SocketAddress(InetAddress inetAddress,int port){...} //InetAddress对象+端口号
客户端(socket)
Socket socket = new Socket(String host,int port); //IP,端口号
OutputStream out = socket.getOutputStream();
out.write("hello,Server");
out.close();
socket.close();
方法
OutputStream getOutputStream() //获取字节输出流对象
IntputStream getInputStream() //获取字节输入流对象
服务器端(SereverSocket)
SereverSocket serever = new SereverSocket(int port); //端口号 要求这个端口号没被占用,否则报异常
Socket server = serever.accept(); //等待接收客户端的Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信,当没 //有客户端连接这个端口会阻塞
InputStream in = server.getInputStream();
int i = 0;
while((i = in.read())!=-1){
System.out.print((char)i);
}
in.close();
server.close();
如果要连续通话,在发送完一个数据的时候应该有个结束标记(没结束标记的话客户端或者服务端不知道什么时候发送结束,就会一直等待)
socket.shutDownOutout(); //写信息结束
socket.shutDownInput(); //读信息结束
UDP
-
没有明确的服务端和客户端,演变成数据的发送端和接收端
-
接收数据和发送数据通过DatagramSocket对象完成
-
将数据封装到DatagramPacket对象/装包
-
当接收到DatagramPacket对象,需要进行拆包,取出数据
-
DatagramSocket可以指定在哪个端口接收数据
无连接、面向数据报的特征,即每次都是没有建立连接,一次发送全部数据报一次接受全部数据报。
基于DatagramSocket类来创建数据报套接字,并使用DatagramPacket描述一个发送或接收数据报。(DatagramSocket类描述一个socket对象,本质是一个文件描述符,表示网卡设备的文件,通过读写socket文件的方式操作网卡)
客户A(服务器端)
import java.io.IOException;
import java.net.*;
public class Server {
public void getServer() throws IOException {
InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);
DatagramSocket datagramSocket = new DatagramSocket(1111);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
String message = new String(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println("接收到客户端发送信息:"+message);
System.out.println("正在向客户端发送信息。。。。。。。。。");
String response = "我是服务器端,能收到";
//获取数据包中的ip地址
InetAddress address = datagramPacket.getAddress();
//获取数据包中的端口号
int port = datagramPacket.getPort();
DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,address,port);
datagramSocket.send(responsePacket);
System.out.println("发送成功!!!!!");
datagramSocket.close();
}
public static void main(String[] args) throws IOException {
Server server = new Server();
server.getServer();
}
}
客户B(客户端)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class Client {
public void getClient() throws IOException {
InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);
DatagramSocket datagramSocket = new DatagramSocket();
System.out.println("发送信息。。。。。。。。。。。");
String message = "我是客户端,能收到吗";
DatagramPacket datagramPacket = new DatagramPacket(message.getBytes(),0,message.getBytes().length,inetSocketAddress);
datagramSocket.send(datagramPacket);
System.out.println("发送成功!!");
byte[] bytes = new byte[1024];
DatagramPacket responsePacket = new DatagramPacket(bytes,0,bytes.length);
datagramSocket.receive(responsePacket);
String response = new String(responsePacket.getData(),0,responsePacket.getLength());
System.out.println("服务器发送信息"+response);
datagramSocket.close();
}
public static void main(String[] args) throws IOException {
Client client = new Client();
client.getClient();
}
}