前言
Socket 类
socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,在java中,socket指的是java.net.Socket类
ServerSocket类
在客户/服务器通信模式中,服务器端需要创建监听特定端口的ServerSocket,ServerSocket负责接收客户连接请求,并生成与客户端连接的Socket
一、简单TCP Demo
1、客户端
代码如下(示例):
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* 客户端
*/
public class clintTCP {
public static void main(String[] args) {
Socket socket=null;
OutputStream os=null;
InputStream is=null;
try {
//服务器的ip地址和端口号
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");
//创建一个socket连接
socket=new Socket(inetAddress,9999);
//发送消息IO流
os =socket.getOutputStream();
os.write("你好啊,生活!".getBytes());
//告诉服务器输入完毕
socket.shutdownOutput();
//读取服务器端返回信息
is =socket.getInputStream();
byte[] buffer=new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
System.out.println(new String(buffer,0,len));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
if(is !=null){
is.close();
}
if(os !=null){
os.close();
}
if(socket !=null){
socket.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
2、服务器端
代码如下(示例):
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
*/
public class ServiceTCP {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream is=null;
OutputStream os=null;
try {
serverSocket=new ServerSocket(9999);
//等待客户端的连接
socket=serverSocket.accept();
//读取客户端信息
is =socket.getInputStream();
byte[] buffer=new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
System.out.println(new String(buffer,0,len));
}
//告诉客户端结束
os =socket.getOutputStream();
os.write("你好,再见".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
关闭资源
try {
if(is !=null){
is.close();
}
if(os !=null){
os.close();
}
if(socket !=null){
socket.close();
}
if(serverSocket !=null){
serverSocket.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
二、简单UDP Demo
1、客户端
代码如下(示例):
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 客户端 不需要连接服务器
*/
public class clintUDP {
public static void main(String[] args) {
DatagramSocket socket=null;
try {
//1 创建一个连接
socket=new DatagramSocket();
String msg="1234";
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");
DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.length(),inetAddress,9090);
//发送
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
if(socket !=null){
socket.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
2、服务器端
代码如下(示例):
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* 服务端
*/
public class ServiceUDP {
public static void main(String[] args) {
DatagramSocket socket=null;
try {
socket=new DatagramSocket(9090);
byte[] buffer=new byte[1024];
DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getData().length));
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
if(socket !=null){
socket.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
总结
Socket使用的tcp连接,需要先连接之后才能发送数据。
DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端