线程安全的下一篇更新
目前主流的网络通信协议是UDP和TCP,下边分别接受基于这两种方式的编程基础
UDP编程:
UDP发送端步骤:
1、创建socket服务
DatagramSocket socket=new DatagramSocket();
2、封装数据包
byte[] data="要发送内容".getBytes();
DatagramPacket packet=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),10000);
//因为演示都是基于本地主机之间的通信,所以IP地址用本机IP地址,端口号可在1025--65535之间选取,为了避免与其他进程重复,所以选择较大的端口
3、通过socket的send方法,发送数据
socket.send(packet);
4.关闭资源(关闭socket服务)
socket.close();
代码实现如下:
SendDenon.java
public class SendDemo{
public static void main(String []args){
DatagramSocket socket=new DatagramSocket();
byte[] data="要发送内容".getBytes();
DatagramPacket packet=new DatagramSocket(data,data.length,InteAddress.getLocalHost(),10000);
socket.send(packet);
socket.close(0;
}
}
UDP接收端:
1、创建socket服务
DatagramSocket socket=new DatagramSocket();
2、创建数据包,用于接收数据
byte[] data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data,data.length);
3、用socket的receive方法接收数据
socket.receive(packet);//这个方法是一个阻塞方法,被调用之后,接收端就一直处于阻塞状态,监听这个端口
4、获取数据包内容
InetAddress ip=packet.getAddress();//获取数据包的IP地址
String content=new String(packet.getData(),0,packet.getLength());
5、关闭资源
socket.close();
代码如下:
ReceiveDemo.java
public class ReceiveDemo{
public static void main(String [] args){
DatagramSocket socket=new DatagramSocket(10000);//此处锁定的端口必须跟发送端的端口一致
byte[]data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data,data.length);
socket.receive(packet);
String content=new String(packet.getData(),0,packet.getLength());
InetAddress ip=packet.getAddress();
socket.close();
}
}
当然,我们并不希望发送端和接收端只进行一次通信,并且发送的内容由我们自己输入,所以我们可以对代码进行下列的优化,这样我们就可以从发送端的控制台手动输入要发送的内容到接收端
SendDeno.java
public class SendDemo{
public static void main(){
DatagramSocket socket=new DatagramSocket();
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
byte[] data=sc.nextLine().getBytes();
DatagramPacket packet=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),10000);
socket.send(packet);
}
socket.close();
}
}
既然发送端可以持续输入发送内容,所以接收端也需要能一直监听这个端口,接收端的优化代码如下:
ReceiveDemo.java
public class ReceiveDemo{
public static void main(String []args){
DatagramSocket socket=new DatagramSocket(10000);
byte[]data=new byte[1024];
DatagramPacket packet=new DatagramPacket(data,data.length);
while(true){
socket.receive(packet);
String content=new String(packet.getData(),0,packet.getLength());
InetAddress ip=packet.getAddress();
System.out.println(ip.getHostAddress+content);
}
//socket.close()因为前边的while()循环是一个死循环,下边的代码是执行不到的,所以资源关闭的步骤可以省略掉,调试代码的时候手动关闭即可
}
}
TCP编程:
客户端编程步骤:
1、创建客户端的socket服务
Socket socket =new Socket("172.16.43.47",10000);//此处的IP地址还是本机地址,端口同上
2、通过socket的getOutputStream()获得流对象
OutputStream out=socket.getOutputStream();
3、通过流对象的方法传输数据
byte[] data="要发送内容".getBytes();
out.write(data);
4、关闭资源
socket.close();
实现代码如下:
ClientDemo.java
public class ClientDemo{
public static void main(){
Socket socket=new Socket("172.16.43.47",10000);
OutputStream out=socket.getOutputStream();
byte[]data="要发送内容".getBytes();
out.write();
//因为TCP协议客户端和服务器端是可以进行交互的,比如在进行连接时候的三次握手,所以还要信息回写
InputStream in=socket.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
String content=new String (buf,0,len);
InetAddress ip=socket.getInetAddress();
System.out.println(ip.getHostAddress()+"-----"+content);
socket.close();
}
}
服务器端编程:
1、创建服务器端socket服务
ServerSocket ss=new ServerSocket(10000);
2、通过服务器端socket服务对象获取客户端socket服务对象
Socket socket=ss.accept();
3、通过socket的getInputStream方法获得流对象
InputStream in=socket.getInputStream();
4、通过流对象操作数据
byte[]data=new byte[1024];
int len=in.read(data);
5、关闭资源
ss.close();
socket.close();
实现代码如下:
ServerDemo.java
public class ServerDemo{
public static void main(){
ServerSocket ss=new ServerSocket(10000);
Socket socket=ss.accept();
InputStream in=socket.getInputStream();
byte[]data=new byte[1024];
int len=in.read(data);
String content=new String(data,0,len);
InetAddress ip=socket.getAddress();
System.out.println(ip.getHostAddress()+"---"+content);
//同理,在服务器端也需要给客户端回写信息
OutputStream out=socket.getOutputStream();
byte[]buf="要回写的信息".getBytes();
out.write();
ss.close();
socket.close();
}
}
同样,我们也希望tcp客户端与服务器端可以一直进行交互,代码如下,原理与UDP的交互相同
ClientDemo.java
public class ClientDemo {
public static void main(String[] args) throws Exception {
Socket socket=new Socket(InetAddress.getLocalHost(),10008);
OutputStream out=socket.getOutputStream();
Scanner sc=new Scanner(System.in);
byte[] data=new byte[1024];
while(sc.hasNext()){
data=sc.nextLine().getBytes();
out.write(data);
}
socket.close();
}
}
ServerDemo.java
public class ServerDemo {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket=new ServerSocket(10008);
//通过ss的accept()方法获取客户端对象
Socket socket=serverSocket.accept();
while(true){
//通过socket获取读取流,获得发送端发送的数据,通过流对象操作数据
InputStream in=socket.getInputStream();
InetAddress ip=socket.getInetAddress();
byte[] buf=new byte[1024];
int len=in.read(buf);
String content=new String(buf,0,len);
System.out.println("ip"+"\t"+ip);
System.out.println("content"+"\t"+content);
}
}
}
浙公网安备 33010602011771号