网络编程
Socker套接字:传输层为应用层开辟的通道
不同的协议针对Socket的实现是不一样的
传输层协议之间的区别:
TCP:面向对象的
UDP:非面向对象的
UDP实现Socket编程:
DatagramSocker:定义接收端和发送端
DatagramPacket:数据包裹
发送端基本流程:
1、定义发送端,指定端口
2、准备数据,转为字节数组
3、数据打包
4、发送数据
5、关闭资源
public static void main(String[] args) throws IOException {
System.out.println("---------发送端----------");
//1.定义发送端 DatagramSocket(int port)
DatagramSocket send=new DatagramSocket(8888);
//2.准备数据 ,转为字节数组
String msg="你好就好,要过的没我好...";
byte[] arr=msg.getBytes();
//3.3.DatagramPacket 打包
//DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
//DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
DatagramPacket packet=new DatagramPacket(arr,0,arr.length,new InetSocketAddress("127.0.0.1", 9999));
//4.发送
send.send(packet);
//5.关闭
send.close();
}
接收端基本流程:
1、定义接收端,指定端口
2、准备字节数组
3、进行打包
4、接收数据
5、处理数据
6、关闭资源
public static void main(String[] args) throws IOException {
System.out.println("---------接收端----------");
//1.DatagramSocket 指定端口号 定义接收端
DatagramSocket rec=new DatagramSocket(9999);
//2.准备字节数组,进行打包(用来接收数据,把数据接收到包裹里面的字节数据中)
byte[] arr=new byte[1024*60];
//3.打包
//DatagramPacket(byte[] buf, int offset, int length)
DatagramPacket packet=new DatagramPacket(arr,0,arr.length);
//4.接收
rec.receive(packet); //阻塞式接收
//5.处理数据
/*
* byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
*/
byte[] newArr=packet.getData();
System.out.println(newArr.length); //字节数组的长度
System.out.println(packet.getLength()); //接到数据的个数
System.out.println(new String(newArr,0,packet.getLength()));
//6.关闭
rec.close();
}
TCP实现客户端:
1、定义客户端,指定服务端IP和端口
2、准备数据
3、通过IO流写入
4、关闭
public static void main(String[] args) throws IOException {
//3.定义客户端
Socket client=new Socket("127.0.0.1",8989);
//1.获取键盘输入流
BufferedReader read=new BufferedReader(new InputStreamReader(System.in));
//2.接收数据
System.out.println("请输入用户名:");
String uname=read.readLine();
System.out.println("请输入密码:");
String upwd=read.readLine();
//发送数据
//4.通过socket获取 输出流
DataOutputStream out=new DataOutputStream(client.getOutputStream());
//5.写出 uname=zhangsan&pwd=123
out.writeUTF("uname="+uname+"&upwd="+upwd);
out.flush();
//6.关闭
out.close();
read.close();
client.close();
TCP实现服务端:
1、定义服务端,指定端口
2、阻塞式监听
3、IO流读写
4、关闭
public static void main(String[] args) throws IOException {
System.out.println("---------Server------------");
//1.定义服务端 ServerSocket
ServerSocket server=new ServerSocket(8989);
//2.Socket accept() 侦听并接受到此套接字的连接。
Socket client=server.accept();
System.out.println("--------一个客户端连接成功---------");
DataInputStream is=new DataInputStream(client.getInputStream());
String str=is.readUTF();
System.out.println(str);
String uname=null;
String upwd=null;
//数据的处理
String[] keyValue=str.split("&");
for(String s:keyValue){
String[] ss=s.split("=");
if("uname".equals(ss[0])){
uname=ss[1];
}else if("upwd".equals(ss[0])){
upwd=ss[1];
}
}
//输出数据到客户端
//3.关闭
is.close();
client.close();
server.close();
}