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();}}