Socket通信
* 网络编程三要素:
ip:
一个计算的标示(找到这个计算机)
端口:
应用程序都会对应一个端口,用来进行通信,有效端口:0~65535,其中0~1024系统使用或保留端口。
协议:
总共有2种协议(TCP,UDP)
UDP
把数据打成一个数据包 , 不需要建立连接
数据包的大小有限制不能超过64k
因为无连接,所以属于不可靠协议(可能丢失数据)
因为无连接 ,所以效率高
TCP
需要建立连接,形成连接通道
数据可以使用连接通道直接进行传输,无大小限制
因为有链接,所以属于可靠协议
因为有链接,所以效率低
InetAddress类的概述
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用,此类表示互联网协议 (IP) 地址。
例子:
public class InetAddressTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//通过主机ip获取对象
InetAddress address = InetAddress.getByName("192.168.20.12");
System.out.println(address.getHostAddress());
System.out.println(address.getHostName());
}
}
UDP通信步骤:
发送端步骤:
UDP发送数据的步骤:
A:创建UDP发送数据端Socket对象
B:创建数据包,并给出数据,把数据打包
C:通过Socket对象发送数据包
D:释放资源
接收端步骤:
UDP协议接收数据步骤:
A:创建UDP接收数据端Socket对象
B:创建一个接收数据的数据包
C:接收数据,数据在数据包中
D:解析数据包,并把数据显示在控制台
E:释放资源
简单的聊天室代码实现:
客户端:
public class Client implements Runnable{
DatagramSocket ds;
public Client(DatagramSocket ds){
this.ds=ds;
}
Scanner sc = new Scanner(System.in);
String s;
@Override
public void run() {
// TODO Auto-generated method stub
while((s=sc.next())!=null){
byte[] buf = s.getBytes();
int length = buf.length;
InetAddress address = null;
try {
address = InetAddress.getByName("192.168.20.12");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int port = 2333;
DatagramPacket dp = new DatagramPacket(buf, length, address, port);
try {
ds.send(dp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ds.close();
}
}
服务端:
public class Server implements Runnable{
DatagramSocket ds;
public Server(DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
byte [] buf = new byte [1024];
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length);
try {
ds.receive(dp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] data = dp.getData();
int i = data.length;
System.out.println(dp.getAddress().getHostAddress()+":"+new String(data, 0, i));
}
}
}
TCp通信步骤:
发送端:
* TCP协议发送数据步骤:
* A:创建TCP协议发送端Socket对象
* 指定服务器IP及端口
* B:获取输出流,并写数据
* C:释放资源
接收端:
* TCP协议接收数据步骤:
* A:创建TCP协议接收端Socket对象
* B:监听客户端连接
* C:获取输入流,并读取数据,显示在控制台
* D:释放资源
例子:
客户端:
public class TcpClient {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Socket sk = new Socket("192.168.20.12", 2345);
OutputStream os = sk.getOutputStream();
byte[] buf = "hello".getBytes();
os.write(buf);
os.close();
sk.close();
}
}
服务端:
public class TcpServer {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ServerSocket ss = new ServerSocket(2345);
Socket sk = ss.accept();
InputStream is = sk.getInputStream();
byte [] buf = new byte [1024];
is.read(buf);
System.out.println(new String(buf,0,buf.length));
is.close();
sk.close();
}
}