1.使用UDP进行数据多次通信
public class UDPReceiver {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//1.创建DatagramSocket对象,
//强调:接收端必须指定一个端口号
DatagramSocket ds = new DatagramSocket(12345);
while(true){
//2.直接创建一个DatagramPacket对象
byte[] bs = new byte[1024];
DatagramPacket dp = new DatagramPacket(bs, bs.length);
//3.接收
System.out.println("等待发送端发送数据....");
ds.receive(dp);//这个方法具有等待功能,等待发送端发送过来的数据
System.out.println("接收数据成功!!");
//获取发送端的地址
InetAddress sendAddress = dp.getAddress();
System.out.println("发送端是:"+sendAddress.getHostAddress());
//获取真正的数据
byte[] data = dp.getData();
//获取发送端 发来了多少字节
int len = dp.getLength();
//打印数据
String receiveMsg = new String(data, 0, len);
System.out.println("发送端说:"+receiveMsg);
}
//4.关闭资源
//ds.close();
}
}
public class UDPSender {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
//1.创建DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
while(true){
//2.创建DatagramPacket对象
//存储 发送的数据,对方的IP,端口号
System.out.println("请输入您要发送的数据:");
String sendMsg = sc.nextLine();
byte[] bs = sendMsg.getBytes();
//IP地址:127.0.0.1 代表本机,本地回环地址
DatagramPacket dp = new DatagramPacket(bs,bs.length,InetAddress.getByName("127.0.0.1"),12345);
//3.发送
ds.send(dp);
System.out.println("发送数据成功!!!");//192.168.146.72
}
//4.关闭资源
//ds.close();
}
}
2.使用TCP传输数据的完整步骤
TCP客户端:
1.创建Socket对象,传入服务器的IP和端口
2.通过Socket对象获取输出流,调用write方法写数据到服务器
3.通过socket对象获取输入流,调用read方法读取服务器反馈的信息
4.关闭(Socket对象)
TCP服务端:
1.创建ServerSocket对象,传入一个端口,端口必须和客户端的一样
2.先获取哪一个客户端连接的服务器,通过accept()方法获取
3.通过Socket对象获取输入流,调用read方法读取客户端发来的数据
4.通过socket对象获取输出流,调用write方法向客户端反馈数据
5.关闭(ServerSocket,Socket)
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 1.创建一个客户端对象(注意:指定这个Socket要连接的服务器的IP和端口)
/*
* 这个构造方法干了很多事情:
* a.自动去连接服务器
* b.自动进行三次握手,建立连接
* c.自动为连接中创建两个流
*/
Socket client = new Socket("127.0.0.1", 12345);
// 2.从客户端对象中获取 输出流:getOutputStream()
//OutputStream out = client.getOutputStream();
// 3.调用输出流的Write方法写数据到服务器即可
//out.write("How are you".getBytes());
client.getOutputStream().write("How are you".getBytes());
System.out.println("给服务器发送数据成功!!");
//4.读取服务器 发送过来的反馈信息
InputStream in = client.getInputStream();
byte[] bs = new byte[1024];
int len = in.read(bs);
System.out.println("服务器响应:"+new String(bs,0,len));
// 关闭资源
client.close();
}
}
public class ServerDemo {
public static void main(String[] args) throws IOException {
//1.创建一个ServerSocket对象,必须绑定一个端口,这个端口必须和客户端连接的端口一致
ServerSocket server = new ServerSocket(12345);
//2.获取到 哪一个 客户端连接的我
System.out.println("等待客户端连接...");
Socket client = server.accept();//此方法也具有等待功能,等待某一个客户端连接
//打印一些和客户端有关信息
String ip = client.getInetAddress().getHostAddress();
System.out.println("小样,抓到你了:"+ip);
//3.获取输入流,实际上是客户端写数据时的输出流
InputStream in = client.getInputStream();
//4.读取数据
byte[] bs = new byte[1024];
int len = in.read(bs);
//打印
System.out.println("客户端说:"+new String(bs,0,len));
//5.要向客户端 回写数据,告诉客户端您的信息我已经收到了
OutputStream out = client.getOutputStream();
out.write("您的消息已经收到...".getBytes());
System.out.println("给客户端反馈的信息发送成功!!!");
//关闭资源
server.close();
client.close();
in.close();
}
}
3.使用TCP文件上传
public class FileUploadClient {
public static void main(String[] args)throws IOException {
//1.创建Socket对象,连接服务器
Socket client = new Socket("127.0.0.1", 12345);
System.out.println("连接服务器成功..");
//2.获取输出流,把数据写向服务器
OutputStream out = client.getOutputStream();
//3.创建文件的输入流,读取本地的文件数据
FileInputStream fis = new FileInputStream("D:\\11.png");
//4.循环,读取本地文件,写到服务器
byte[] bs = new byte[1024];
int len = 0;
while((len=fis.read(bs))!=-1){
out.write(bs, 0, len);
}
System.out.println("文件已经上传到服务器.");
//5.关闭
client.close();
out.close();
fis.close();
}
}
public class FileUploadServer {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//1.创建ServerSocket对象,绑定一个端口
ServerSocket server = new ServerSocket(12345);
while(true){
//2.获取哪一个客户端连接的服务器
System.out.println("等待客户端连接...");
Socket client = server.accept();
System.out.println("小样:"+client.getInetAddress().getHostAddress());
//3.获取输入流,读取客户端发来数据
InputStream in = client.getInputStream();
//4.创建文件的输出流,把数据写到文件中
String picName = "F:\\"+System.currentTimeMillis()+".png";
FileOutputStream fos = new FileOutputStream(picName);
//5.循环 从输入流读取客户端数据, 写入到文件中
byte[] bs = new byte[1024];
int len = 0;
while((len=in.read(bs))!=-1){
fos.write(bs, 0, len);
}
System.out.println("客户端的文件已经保存完毕,可以查看了"+picName);
client.close();
in.close();
fos.close();
}
//6.关闭
//server.close();
}
}