一、有关网络编程概念
传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字是(210.37.145.1:23)。
总之,套接字Socket=(IP地址:端口号)。
有关网络编程中的API:
- java.net包下的InetAddress类:此类表示互联网协议(IP)地址。
- (1)InetAddress getLocalHost()
- 域名:www.baidu.com
- 因为IP地址的数字较长,不方便记忆。所以设计了域名,来与IP地址对应。
- 由域名解析器(DNS)来解析对应关系。InetAddress getByName(xx) 来获取主机名和ip地址
二、TCP网络编程
2.1 TCP网络编程的客户端
- TCP网络编程的客户端:
- 1.创建一个Socket对象,并且指定“服务器”的IP地址和端口号;
- 主动与服务器建立连接
- 如果服务器没开或端口号、IP地址错误,会报异常。 ConnectionException
- 2.接收数据
- 3.关闭连接
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket client = new Socket("192.168.235.1",8888);
//2.接收数据
InputStream in = client.getInputStream();
int len;
byte[] data = new byte[1024];
while((len = in.read(data) ) != -1) {
System.out.println(new String(data, 0,len));
}
//3.关闭连接
in.close();
client.close();
}
}
2.2 TCP网络编程的服务端
TCP网络编程的服务器端:
-
步骤:
-
1.创建一个ServerSocket的对象,指定IP地址和监听的端口号;
-
ip地址没有指定默认是运行该程序的本机地址。
-
2.监听客户端的连接,如果没有连接,那么该方法阻塞
-
3.如果有人连接就可以通信
-
1)接收数据
-
2)发送数据
-
4.不通信了,断开连接
-
(1)关闭从socket获取的输入输出流对象,也会导致socket关闭。
-
习惯上还是会先关IO流再关socket。
-
(2)一旦关闭不能在通信了,只能重新连接。
-
(3)TCP程序最好能够正确关闭,因为TCP程序是面向连接的,
-
TCP程序连接之前有三次握手,关闭对“四次挥手”才能关闭。
-
一次TCP连接的成本很高,因此要珍惜。
-
Socket中有这样的方法:
-
(1)getOutputStream()
-
(2)getInputStream()
-
(3)getInetAddress():获取对方的IP地址
-
小技巧:如果既要读字符串又要读字节数据,用DataInputStream;
-
如果网络编程,需要把写的通道关闭,不关闭读的通道,可以用socket.shoutdownOutput();方法
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
//1.创建一个ServerSocket的对象,指定IP地址和监听的端口号
ServerSocket server = new ServerSocket(8888);
//2.监听(接受)客户端的连接
Socket client = server.accept();
System.out.println("一个客户端连接成功");
//3.发送数据,发送“欢迎你连接”
//这里发送数据就算写数据,这个数据是写到网络中,写给客户端的。
//写数据要用到输出流,而且此处是字节流
OutputStream out = client.getOutputStream();
out.write("欢迎你连接".getBytes());
//4.不通信了,断开连接
out.close();
client.close();
//5.如果需要,关闭服务器
server.close();
}
}
三、UDP网络编程
3.1 UDP发送端
- UDP编程:
- DatagramSocket
- DatagramPacket
- UDP的发送端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class UdpBasic {
public static void main(String[] args) throws Exception {
//先创建DatagramSocket对象
//可以不指定端口号和IP地址,IP默认本机
DatagramSocket ds = new DatagramSocket();
//2.准备发送的数据
String str = "大家新年好!";
byte[] data = str.getBytes();
//3.把数据包装成一个数据报
//DatagramPacket(字节数组,数据长度,接收方的主机名和IP地址,接收方监听端口号)
InetAddress ip = InetAddress.getByName("192.168.235.1");
DatagramPacket dp = new DatagramPacket(data,data.length,ip,9999);
//4.发送
ds.send(dp);//通过socket对象发送数据
System.out.println("发送完毕");
//5.关闭
ds.close();
}
}
3.2 UDP的接收方
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpReceive {
public static void main(String[] args) throws Exception {
//1.先创建DatagramSocket对象,需要指定端口号
DatagramSocket ds = new DatagramSocket(9999);
//2.准备接收数据的数据报和字节数组
byte[] data = new byte[1024];
DatagramPacket dp = new DatagramPacket(data, data.length);
System.out.println("等待数据中.....");
//3.接收数据
ds.receive(dp);//通过socket接收,这是个阻塞方法
//4.显示数据
String message = new String(dp.getData(),0,dp.getLength());
System.out.println(message);
//5.关闭
ds.close();
}
}
来源:CSDN
作者:Charles_ZengYC
链接:https://blog.csdn.net/Charles_ZengYC/article/details/104731491