Java网络编程快速入门【狂神篇】(1)

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){

}

}

}

}

6.2、文件上传


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();

}

}

7、UDP

===============================================================

不需要连接,有地址和端口即可

7.1、发送消息


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();

}

}

}

7.2、循环发送


键盘自定义输入

循环发送

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();

}

}

}

7.3、聊天


只有双方都输入 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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值