Socket是网络驱动层提供给应用程序编程的接口和一种机制。我们可以认为Socket是应用程序创建的一个港口码头,应用程序只要把装着货物的集装箱(在程序中就是要通过网络发送的数据)放到港口码头上,就算完成了货物的运送,剩下的工作就有货运公司去处理了(在计算机中由驱动程序来充当货运公司)。
对于接收方来说,应用程序也要创建一个港口码头,然后就一直等待到该码头的货物到达,最后宠码头上取走货物(发给该应用程序的数据)。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port。此后,应用程序送给Socket 数据,由 Socket 交给驱动程序向网络上发送出去。计算机服务端从网络上收到与该 Socket 绑定的 IP+Port 相关的数据后,由驱动程序交给 Socket,应用程序便可从该Socket 中提取接收到的数据。网络应用程序就是这样通过Socket进行数据的发送与接收的。
package com.java.DataGamesocket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* UDP(user datagram protocol:用户数据报协议)实例
* 负责发送数据类
* @author songlailiang
*
*/
public class Udpsend {
private static DatagramSocket ds;
public static void main(String[] args) {
send();
}
public static void send(){
try {
ds = new DatagramSocket(); //创建DatagramSocket对象,用于UDP发送或接收数据
String str = "您好,hello word!";
DatagramPacket dp = new DatagramPacket(str.getBytes(), //创建发送包对象,
str.getBytes().length, //这里最好不要写成str.length,因为如果发送的内容是汉字,一个汉字占用2个字节,接收的时候可能会造成数据接收不全
InetAddress.getByName("192.168.1.164"), 12345); //设置接收的IP和端口
ds.send(dp); //发送数据
} catch (SocketException e) {
System.out.println("new DatagramSocket()执行异常");
e.printStackTrace();
}catch (UnknownHostException e) {
System.out.println("new DatagramPacket()执行异常");
e.printStackTrace();
} catch (IOException e) {
System.out.println("ds.send(dp)执行异常");
e.printStackTrace();
}finally{
ds.close(); //关闭socket通道,释放资源
}
}
}
************************************************************************************************
package com.java.DataGamesocket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/**
* UDP(用户数据报协议)实例,负责接收数据类
* 测试时,要先运行接收程序,再运行发送程序,否则接收不到数据。
* @author
*
*/
public class UdpResive {
private static DatagramSocket ds;
public static void main(String[] args) {
resive();
}
private static void resive() {
try {
ds = new DatagramSocket(12345); //创建DatagramSocket对象,用于UDP发送或接收数据,指定接收端口
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf , 1024); //创建接收数据包对象,限定最大是1024个字节
ds.receive(dp); //接收数据
String strresive=new String(dp.getData(),0,dp.getLength())+
" from "+dp.getAddress().getHostAddress()+":"+dp.getPort();
System.out.println(strresive);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
ds.close(); //关闭socket通道,释放资源
}
}
public static void send(){
try {
ds = new DatagramSocket(); //创建DatagramSocket对象,用于UDP发送或接收数据
String str = "您好,hello word!";
DatagramPacket dp = new DatagramPacket(str.getBytes(), //创建发送包对象,
str.getBytes().length, //这里最好不要写成str.length,因为如果发送的内容是汉字,一个汉字占用2个字节,接收的时候可能会造成数据接收不全
InetAddress.getByName("192.168.1.164"), 12345); //设置接收的IP和端口
ds.send(dp); //发送数据
} catch (SocketException e) {
System.out.println("new DatagramSocket()执行异常");
e.printStackTrace();
}catch (UnknownHostException e) {
System.out.println("new DatagramPacket()执行异常");
e.printStackTrace();
} catch (IOException e) {
System.out.println("ds.send(dp)执行异常");
e.printStackTrace();
}finally{
ds.close(); //关闭socket通道,释放资源
}
}
}