try {
while (true) {
//创建服务
serverSocket = new ServerSocket(9999);
//等待客户端连接
socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
//获取输入流
is = socket.getInputStream();
//建立管道流,接收消息
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
//读取消息
//int read(byte[] b):读取若干字节并填充到byte[]数组,返回读取的字节数
while ((len = is.read(buffer)) != -1) {
//把 buffer 中的数据从 0 到 len,写入 baos
baos.write(buffer, 0, len);
}
System.out.println(“收到!” + baos.toString());
}
}catch (IOException e){
}finally {
try{
//关闭管道流
if (baos != null) {
baos.close();
}
//关闭输入流
if (is != null) {
is.close();
}
//关闭连接
if (socket != null) {
socket.close();
}
//关闭服务
if (serverSocket != null) {
serverSocket.close();
}
}catch (IOException e){
}
}
}
}
package com.ajun;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
-
@author ajun
-
Date 2021/6/29
-
@version 1.0
-
模拟文件上传客户端
*/
public class TCPFileUploadClient {
public static void main(String[] args) throws Exception {
//创建连接
Socket socket = new Socket(InetAddress.getByName(“127.0.0.1”), 9900);
//获取输出流
OutputStream outputStream = socket.getOutputStream();
//读取文件
FileInputStream inputStream = new FileInputStream(“IMG_20200809_090035.jpg”);
//写入文件
byte[] buffer = new byte[1024];
int len;
while((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
//上传完毕:关闭连接
socket.shutdownOutput();
//确定服务端接收完毕,然后再关闭连接
InputStream inputStream1 = socket.getInputStream();//接收服务端反馈信息
ByteArrayOutputStream os2 = new ByteArrayOutputStream();//把接收到的信息输出
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = inputStream1.read(buffer2))!=-1){
os2.write(buffer2,0,len2);
}
System.out.println(os2.toString());
//read是阻塞的,执行完之后,后面的代码才可以执行
//关闭
inputStream1.close();
os2.close();
inputStream.close();
outputStream.close();
socket.close();
}
}
package com.ajun;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/**
-
@author ajun
-
Date 2021/6/29
-
@version 1.0
-
模拟文件接收服务端
*/
@SuppressWarnings({“all”})
public class TCPFileUploadService {
public static void main(String[] args) throws IOException {
//创建服务
ServerSocket serverSocket = new ServerSocket(9900);
//监听连接
Socket socket = serverSocket.accept();
//获取输入流
InputStream inputStream = socket.getInputStream();
//文件输出
FileOutputStream fos = new FileOutputStream(“service.jpg”);
byte[] buffer = new byte[1024];
int len;
while((len = inputStream.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//通知客户端接收完毕
OutputStream os = socket.getOutputStream();
os.write(“接收完毕”.getBytes(StandardCharsets.UTF_8));
//write是阻塞的,执行完之后,后面的代码才可以执行
//关闭
os.close();
fos.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
===============================================================
不需要连接,有地址和端口即可
package com.ajun;
import java.io.IOException;
import java.net.*;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
客户端发送消息
*/
public class UDPClient {
public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
try{
//建立socket
socket = new DatagramSocket();
//建立要发送的数据包
String msg = “Hello world!”;
byte[] buffer = msg.getBytes();
InetAddress host = InetAddress.getByName(“localhost”);
int port = 9999;
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length,host,port);
//发送
socket.send(packet);
}finally {
//关闭连接
socket.close();
}
}
}
package com.ajun;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
服务端接收消息
*/
public class UDPService {
public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
try{
//开放端口
socket = new DatagramSocket(9999);
//准备接收数据的容器
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.getLength()));
}finally {
//关闭
socket.close();
}
}
}
键盘自定义输入
循环发送
package com.ajun;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
发送
*/
public class UDPSender {
public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
BufferedReader reader = null;
try{
//建立连接
socket = new DatagramSocket(9000);//本机端口
//准备数据:控制台输入
reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println(“请输入要发送的消息…[注:bye 为退出]”);
//循环发送
while (true){
String data = reader.readLine();
byte[] datas = data.getBytes();
InetAddress host = InetAddress.getByName(“localhost”);
int port = 8000;//接收方端口
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, host, port);
//发送
socket.send(packet);
if(data.equals(“bye”)){
break;
}
}
}finally {
//关闭
reader.close();
socket.close();
}
}
}
package com.ajun.com.ajun;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
接收
*/
public class UDPService {
public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
try{
//开启服务,监听连接
socket = new DatagramSocket(8000);
//循环接收
while (true){
//准备接收
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//接收
socket.receive(packet);//阻塞式
byte[] serviceData = packet.getData();
String sd = new String(serviceData, 0, packet.getLength());
System.out.println(sd);
if(sd.equals(“bye”)){
break;
}
}
}finally {
//关闭
socket.close();
}
}
}
只有双方都输入 bye 时,进程才会结束
一方输入 bye 时,只有这一方断开,另一方还在连接中
- 发送器
package com.ajun;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
发送消息
*/
public class TalkSend implements Runnable {
private DatagramSocket socket = null;//连接
private BufferedReader reader = null;//输入流
private int fromPort;//发送方端口
private int toPort;//接收方端口
private String toHost;//接收主机
private InetAddress host;
//构造器
public TalkSend(int fromPort, int toPort, String toHost) {
this.fromPort = fromPort;
this.toPort = toPort;
this.toHost = toHost;
try {
host = InetAddress.getByName(toHost);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//建立连接
socket = new DatagramSocket(fromPort);//本机端口
//准备数据:控制台输入
reader = new BufferedReader(new InputStreamReader(System.in));
//System.out.println("我是 " + Thread.currentThread().getName());
System.out.println(“发送消息…[注:bye 为退出]”);
while (true) {
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, host, toPort);
//发送
socket.send(packet);
if (data.equals(“bye”)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭
if(reader!=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
socket.close();
}
}
}
}
- 接收器
package com.ajun;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
接收消息
*/
public class TalkReceive implements Runnable {
private DatagramSocket socket = null;
private int receivePort;//接收端口
private String sender;//发送方
public TalkReceive(int receivePort, String sender) {
this.receivePort = receivePort;
this.sender = sender;
}
@Override
public void run() {
try {
//开启服务,监听连接
socket = new DatagramSocket(receivePort);
while (true) {
//准备接收
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//接收
socket.receive(packet);//阻塞式
byte[] serviceData = packet.getData();
String sd = new String(serviceData, 0, packet.getLength());
System.out.println(“[” + sender + "] " + sd);
if (sd.equals(“bye”)) {
break;
}
}
} catch (IOException e) {
}finally {
//关闭
if (socket != null) {
socket.close();
}
}
}
}
- 聊天一方
package com.ajun;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
a = packet.getData();
String sd = new String(serviceData, 0, packet.getLength());
System.out.println(“[” + sender + "] " + sd);
if (sd.equals(“bye”)) {
break;
}
}
} catch (IOException e) {
}finally {
//关闭
if (socket != null) {
socket.close();
}
}
}
}
- 聊天一方
package com.ajun;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-0ucTcW0F-1715762851266)]
[外链图片转存中…(img-204cVdiz-1715762851267)]
[外链图片转存中…(img-CsYoApub-1715762851267)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!