概述
 TCP、UDP
TCP(Transmission Control Protocel)传输控制协议 传输协议面向连接,传输数据最为安全,确保数据一定会发送到目标位置,但是速度慢
UDP(User Datagram Protocol)用户数据报协议 面向断开式的通信协议,不确保数据发送到位置,但速度快
java.net组件包
java.net.URL 统一资源定位符 java.net.IntetAddress 互联网IP地址 java.net.Socket 客户端套接字 java.net.ServerSocket 服务器端套接字 java.net.DatagramPacket 数据报包 java.net.DatagramSocket 数据报包套接字
URL URL类代表一个统一资源定位符,指向互联网”资源“的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,如对数据库或搜索引擎的查询、更改等操作。  常用创建方法 public URL(String spec) public URL(String protocol,String host,String file) public URL(String protocol,String host,int port,String file) public URL(URL context,String spec)
IP地址 InetAddress和SocketAddress、
此类表示互联网协议(IP)地址,IP地址是IP使用的32位或128位无符号数字,它是一种低级协议,UDP和TCP协议都是在他的基础上构建的 
package day23Test.xzit.ipaddress;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class ipAddressTest {
public static void main(String[] args) {
try {
InetAddress add0 = InetAddress.getLocalHost();
System.out.println(add0.getHostName());
System.out.println(add0.getHostAddress());
InetAddress baiduIp = InetAddress.getByName("www.baidu.com");
System.out.println(baiduIp.getHostName());
System.out.println(baiduIp.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
InetSocketAddress isa = new InetSocketAddress("localhost",9090);
System.out.println(isa.getHostName());
System.out.println(isa.getPort());
System.out.println(isa.getAddress());
}
}
Socket
Socket类实现客户端套接字(简称套接字),套接字是两台机器间通信的端点。 java基于互联网的C/S模式的客户端程序主要依赖此类实现与服务器端的通信,它是java网络编程的核心组件。 socket组件实例通常必须绑定Ip地址(客户机网络域名)和一个未被在本机机器占用的端口号。 创建 public Socket() public Socket(InetAddress address,int port)创建指定ip地址和端口号的套接字 public Socket(InetAddress address,int port,InetAddress localAddr,int localPort)创建连接到远处服务器的套接字 public Socket(String host,int port)接到指定主机的指定端口号 常用方法 void bind(SocketAddress bindpoint) void close()关闭套接字 void connect(SocketAddress endpoint)将此套接字连接到服务器 void connect(SocketAddress endpoint,int timeout)套接字连接服务器,指定超时时间 InputStream getInputStream()返回此套接字的输入流 OutputStream getOutStream()返回此套接字的输出流
ServerSocket
ServerSocket类实现服务器套接字,服务器套接字等待请求通过网络传入,它基于该请求执行某些操作,然后可能像请求者返回结果 创建 public ServerSocket()无参构造器,创建非绑定服务器套接字 public ServerSocket(int port)创建一个绑定到特定端口的服务器套接字 public ServerSocket(int port,int backlog)指定端口号和队列长度 public ServerSocket(int port,int backlog,InetAddress bindAddr)指定端口号队列长度及指定主机地址创建套接字 常用方法 public Socket accept() throw IOException倾听并接受到此套接字的连接,未连接时处于阻塞状态 void close()关闭套接字 void SetSoTimeout(int timeout)以毫秒为单位设置超时时间,如果为0则永不超时 public boolean isBound()测试ServerSocket是否绑定 public boolean isClose()测试是否关闭 public InetAddress getInetAddress()返回此服务器套接字的本地地址 整合:分别建立客户端和服务器,连接并传输数据 客户端:
package day23Test.xzit.socket;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
public class SocketTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Socket client = new Socket();
InetSocketAddress address = new InetSocketAddress("localhost",9900);
try {
client.bind(address);
System.out.println(client.isBound());
System.out.println(client.isConnected());
InputStream in = null;
OutputStream out = null;
DataInput din = null;
DataOutput dout = null;
InetSocketAddress removeAddr = new InetSocketAddress("localhost",997);
if(!client.isConnected()){
try {
client.connect(removeAddr);
in = client.getInputStream();
out = client.getOutputStream();
din = new DataInputStream(in);
dout = new DataOutputStream(out);
while (true){
System.out.println("请输入要输入的信息");
String msg = scan.next();
dout.writeUTF(msg);
String receiveMes = din.readUTF();
System.out.println("服务器返回信息是:" + receiveMes);
}
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
服务器
package day23Test.xzit.socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketTest {
public static void main(String[] args) {
ServerSocket server = null;
Socket client = null;
InputStream in = null;
OutputStream out = null;
DataInput din = null;
DataOutput dout = null;
try {
server = new ServerSocket(997);
while (true){
System.out.println("等待连接");
client = server.accept();
System.out.println("连接成功");
in = client.getInputStream();
din = new DataInputStream(in);
out = client.getOutputStream();
dout = new DataOutputStream(out);
while(true){
String receiveMsg = din.readUTF();
dout.writeUTF("你是什么东西," + receiveMsg + "?");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果:(先运行服务器,再运行客户端) 1、先运行服务器,此时服务器等待连接  2、然后运行客户端,客户端连接服务器,并让客户输入信息,这里输入了“我的信息”  3、服务器连接成功,并将信息发送给客户端  4、客户端循环发信息给服务器

DatagramPacket
DatagramPacket类表示用户数据报包,数据报包用来实现无连接包投递服务。数据报包中可以包含各种数据类型的对象; 每条报文只根据该包中包含的信息(通常是url和端口号)从一台机器路由到另一台机器; 从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达,不对包投递做出保证
创建(常用) public DatagramPacket(byte[] buf,int len)构建用来接收长度为len的数据包,len必须小于等于buf长度 public DatagramPacket(byte[] buf,int len,SocketAddress addr)构建用来接收长度为len的数据包,指定发送目的地址 public DatagramPacket(byte[] buf,int len,InetAddress addr,int port)构建用来接收长度为len的数据包,指定用来发送目的地址和端口号 常用方法 void setData(byte[] buf)设置数据缓冲区 void setSocketAddress(SocketAddress addr) void setSocketAddress(SocketAddress addr,int port) void setLength(int length)设置数据包缓冲区长度 byte[] getData()获取数据包缓冲区 int getLength()返回将要发送或接受到的数据的长度
DatagramSocket
DatagramSocket类表示用来发送或接收数据报包的套接字。数据包套接字是包投递服务的发送或接收点。每个数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达
构建(常用) public DatagramSocket()构建数据报套接字并将其绑定到主机上任何可用的端口 public DatagramSocket(int port)绑定到指定端口 public DatagramSocket(int port,InetAddress addr)绑定到指定端口和指定本地地址 public DatagramSocket(int port,SocketAddress addr)创建数据报套接字并将其绑定到指定的本地套接字地址 常用方法 void bind(SocketAddress addr)绑定一个IP地址 void connect(SocketAddress addr)发送 void disconnect()断开(非关闭) void recive(DatagramPacket p)接收数据包 void send(DatagramPacket p)发送数据包 void close()关闭数据包套接字
整合 客户端:
package day23Test.xzit.socket;
import java.io.IOException;
import java.net.*;
public class DatagramPacketTest {
public static void main(String[] args) {
byte[] bys = new String("天天爱学习").getBytes();
DatagramPacket dp = new DatagramPacket(bys,bys.length);
byte[] bys2 = new byte[60];
DatagramPacket dp2 = new DatagramPacket(bys2,bys2.length);
SocketAddress addr = new InetSocketAddress("localhost",1254);
try {
DatagramSocket ds = new DatagramSocket(8921);
ds.connect(addr);
System.out.println("开始发送数据");
ds.send(dp);
ds.receive(dp2);
bys2 = dp2.getData();
System.out.println("返回的数据报包数据是:" + new String(bys2));
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器:
package day23Test.xzit.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class DatagramServerTest {
public static void main(String[] args) {
byte[] bys = new byte[18];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
try {
DatagramSocket ds = new DatagramSocket(1254);
System.out.println("准备接收数据报包:");
ds.receive(dp);
System.out.println("客户端发送的数据是:" + new String(dp.getData()));
byte[] bys2 = new String("给客户端买糖吃").getBytes();
DatagramPacket dp2 = new DatagramPacket(bys2,bys2.length);
dp2.setAddress(InetAddress.getByName("localhost"));
dp2.setPort(8921);
ds.send(dp2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果:  
|