java网络多线程专题

//2.当没有客户端连接9999端口时,程序会阻塞,等待连接

//如果有客户端连接,则会返回socket对象,程序继续

Socket socket = serverSocket.accept();

System.out.println(“服务端 socket =”+socket.getClass());

//3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示

InputStream in = socket.getInputStream();

byte[] bt = new byte[1024];

int readLen = 0;

while((readLen= in.read(bt)) != -1){

System.out.println(new String(bt,0,readLen));

}

//关闭流和socket

in.close();

socket.close();

serverSocket.close();

}

}

客户端代码:

package com.hsp.net.socket;

import java.io.IOException;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

/**客户端

  • Description

  • User:

  • Date:

  • Time:

*/

public class SocketTCP01Client {

public static void main(String[] args) throws IOException {

//1.连接服务器(ip,端口)

//连接本机的9999端口

Socket socket = new Socket(InetAddress.getLocalHost(), 9999);

System.out.println(“客户端:”+socket.getClass());

//2.连接上后,生成Socket,通过

//socket.getOutputStream()

OutputStream out = socket.getOutputStream();

//3.通过输出流,写入数据到数据通道

out.write(“hello server”.getBytes());

//4.关闭流对象和socket,必须关闭

out.close();

socket.close();

System.out.println(“客户端退出了”);

}

}

TCP网络通信编程应用案例2


  1. 编写一个服务器端和一个客户端

  2. 服务端在9999端口监听

  3. 客户端连接到服务器端,发送hello server,并接收服务器端返回的hello,client再退出

  4. 服务器端接收到客户端发送的信息,输出hello client再退出

服务端代码:

package com.hsp.net.socket;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SSocketTCP02Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(9999);

System.out.println(“服务端等待连接中…”);

Socket socket = serverSocket.accept();

System.out.println(“服务端 端口号9999 收到连接”);

System.out.println(“服务端向用户端发送信息”);

OutputStream out = socket.getOutputStream();

out.write(“hello client”.getBytes());

socket.shutdownOutput();

InputStream in = socket.getInputStream();

System.out.println(“服务端接收来自用户端的信息”);

byte[] bt = new byte[1024];

int length = 0;

while((length=in.read(bt))!=-1){

System.out.println(new String(bt,0,length));

}

socket.shutdownInput();

in.close();

out.close();

socket.close();

serverSocket.close();

System.out.println(“服务端退出”);

}

}

客户端代码:

package com.hsp.net.socket;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SocketTCP02Client {

public static void main(String[] args) throws IOException {

Socket socket = new Socket(InetAddress.getLocalHost(),9999);

System.out.println(“用户端:”+socket);

OutputStream out = socket.getOutputStream();

System.out.println(“用户端向服务端发送信息”);

out.write(“hello serve”.getBytes());

socket.shutdownOutput();

InputStream in = socket.getInputStream();

System.out.println(“用户端接收来自服务端的信息”);

byte[] bt = new byte[1024];

int length = 0;

while((length=in.read(bt))!=-1){

System.out.println(new String(bt,0,length));

}

socket.shutdownInput();

in.close();

out.close();

socket.close();

System.out.println(“用户端退出”);

}

}

TCP网络通信编程应用案例3(使用字符流)


  1. 编写一个服务器端和一个客户端

  2. 服务端在9999端口监听

  3. 客户端连接到服务器端,发送hello server,并接收服务器端返回的hello,client再退出

  4. 服务器端接收到客户端发送的信息,输出hello client再退出

这里需要现将字节流利用转换流转换成字符流,服务端接收到字节流,在转换成字符流进行输出

服务端代码:

package com.hsp.net.socket;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SSocketTCP03Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(9999);

System.out.println(“服务端等待连接中…”);

Socket socket = serverSocket.accept();

System.out.println(“服务端 端口号9999 收到连接”);

System.out.println(“服务端向用户端发送信息”);

OutputStream out = socket.getOutputStream();

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out));

bufferedWriter.write(“hello client:字符流”);

bufferedWriter.flush();//如果使用的字符流,需要手动刷新,否则数据不会写入数据通道

bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,注意,要求对方使用readLine()

socket.shutdownOutput();

InputStream in = socket.getInputStream();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));

System.out.println(“服务端接收来自用户端的信息”);

String s = bufferedReader.readLine();

System.out.println(s);

socket.shutdownInput();

in.close();

out.close();

socket.close();

serverSocket.close();

System.out.println(“服务端退出”);

}

}

用户端代码:

package com.hsp.net.socket;

import java.io.*;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SocketTCP03Client {

public static void main(String[] args) throws IOException {

Socket socket = new Socket(InetAddress.getLocalHost(),9999);

System.out.println(“用户端:”+socket);

OutputStream out = socket.getOutputStream();

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out));

bufferedWriter.write(“hello serve:字符流”);

bufferedWriter.flush();

bufferedWriter.newLine();

System.out.println(“用户端向服务端发送信息”);

socket.shutdownOutput();

InputStream in = socket.getInputStream();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));

System.out.println(“用户端接收来自服务端的信息”);

String s = bufferedReader.readLine();

System.out.println(s);

socket.shutdownInput();

in.close();

out.close();

socket.close();

System.out.println(“用户端退出”);

}

}

TCP网络通信编程应用案例4


  1. 编写一个服务器端和一个客户端

  2. 服务端在9999端口监听

  3. 客户端连接到服务器端,发送一张图片e:\qie.png

  4. 服务器端接收到客户端发送的图片,保存在src下发送“收到图片”再退出

  5. 客户端接收到服务端发送的收到图片再退出

  6. 该程序要求使用StreamUtils.java

StreamUtils的作用:将输入流转换成byte[],即可以把文件的内容读入到byte[]

示意图:

使用BufferedInputStream和BufferedOutputStream字节流

服务端代码:

package com.hsp.net.socket;

import com.hsp.net.StreamUtils;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.stream.Stream;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SSocketTCP04Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(9999);

Socket socket = serverSocket.accept();

//接收用户端传递的图片数组,并将其输出在src目录下

BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());

byte[] bytes = StreamUtils.streamTobytes(bis);

socket.shutdownInput();

String filepath = “src/test.png”;

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filepath));

bos.write(bytes);

//服务端向用户端发送信息

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

bw.write(“图片发送成功”);

bw.flush();

bw.newLine();

socket.shutdownOutput();

bw.close();

bos.close();

bis.close();

socket.close();

serverSocket.close();

}

}

用户端代码:

package com.hsp.net.socket;

import com.hsp.net.StreamUtils;

import java.io.*;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SocketTCP04Client {

public static void main(String[] args) throws Exception {

Socket socket = new Socket(InetAddress.getLocalHost(),9999);

// //将图片转换成字节数组

String filepath = “E:\test.png”;

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filepath));

byte[] bytes = StreamUtils.streamTobytes(bis);

BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());

bos.write(bytes);

socket.shutdownOutput();

//用户端接收服务端发送的消息

// BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

InputStream inputStream = socket.getInputStream();

System.out.println(StreamUtils.streamToString(inputStream));

socket.shutdownInput();

// br.close();

inputStream.close();

bos.close();

bis.close();

socket.close();

}

}

netstat指令

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

  1. netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况

  2. netstat -an | more 可以分页显示

  3. netstat -anb 查看是端口是由哪个程序占用的

  4. 要求在dos控制台下执行

在这里插入图片描述

说明:

(1)Listening表示某个端口在监听

(2)如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息

UDP网络通信编程

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

基本介绍:


  1. 类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序

  2. UDP数据报通过数据报套接字(socket)DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达

  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号

  4. UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接

UDP编程的基本流程


  1. 核心的两个类/对象 DatagramSocket于DatagramPacket

  2. 建立发送端,接收端

  3. 建立数据包

  4. 调用DatagramSocket的发送,接收方法

  5. 关闭DatagramSocket

UDP网络通信编程


在这里插入图片描述

TCP和UDP综合案例

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

案例1


  1. 使用字符流的方式编写一个客户端程序和服务器端程序

  2. 客户端发送"name",服务器端接收到后,返回“我是nova”,nova是你自己的名字

  3. 客户端发送"hobby",服务器端接收到后,返回"编写java程序"

  4. 不是这两个问题,回复"你说啥呢"

服务端代码:

package com.hsp.net.homework;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class homework01Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(9999);

System.out.println(“服务端等待接收数据…”);

Socket socket = serverSocket.accept();

BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String s = bf.readLine();

// socket.shutdownInput();

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

if(“name”.equals(s)){

bw.write(“我是novo,是你自己的名字”);

bw.flush();

bw.newLine();

// socket.shutdownOutput();

}else if(“hobby”.equals(s)){

bw.write(“编写java程序”);

bw.flush();

bw.newLine();

// socket.shutdownOutput();

}else{

bw.write(“不清楚”);

bw.flush();

bw.newLine();

// socket.shutdownOutput();

}

//关闭资源

bw.close();

bf.close();

socket.close();

serverSocket.close();

System.out.println(“服务器端退出”);

}

}

客户端代码:

package com.hsp.net.homework;

import java.io.*;

import java.net.InetAddress;

import java.net.Socket;

import java.util.Scanner;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class homework02Client {

public static void main(String[] args) throws IOException {

Socket socket = new Socket(InetAddress.getLocalHost(),9999);

//向Server发送数据

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

Scanner sc = new Scanner(System.in);

String next = sc.next();

bw.write(next);

bw.newLine();

bw.flush();

// socket.shutdownOutput();

//接收来自服务端的信息

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String s = br.readLine();

// socket.shutdownInput();

System.out.println(“服务器说:”+s);

//关闭资源

br.close();

bw.close();

socket.close();

System.out.println(“客户端退出”);

}

}

案例2


  1. 编写一个接收端A和一个发送端B,使用UDP协议完成

  2. 接收端在8888端口等待接收数据(receive)

  3. 发送端向接收端发送数据"四大名著是哪些"

  4. 接收端接收到发送端发送的问题后,返回“四大名著是《红楼梦》…”,否则返回what?

  5. 接收端和发送端程序退出

接收端代码:

package com.hsp.net.homework;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

/**

  • Description

  • User:

  • Date:

  • Time:接收端

*/

public class homework02Receiver {

public static void main(String[] args) throws IOException {

DatagramSocket socket = new DatagramSocket(9999);

byte[] bt = new byte[1024];

DatagramPacket packet = new DatagramPacket(bt,bt.length);

System.out.println(“Receiver等待接收数据…”);

socket.receive(packet);

int length = packet.getLength();

byte[] data = packet.getData();

String s = new String(data, 0, length);

byte[] bytes1 = “红楼梦…”.getBytes();

byte[] bytes2 = “what”.getBytes();

if(“四大名著是哪些”.equals(s)){

System.out.println(“进入”);

DatagramPacket packet1 = new DatagramPacket(bytes1,bytes1.length, InetAddress.getByName(“192.168.10.1”),9998);

socket.send(packet1);

}else{

DatagramPacket packet1 = new DatagramPacket(bytes2,bytes2.length, InetAddress.getByName(“192.168.10.1”),9998);

socket.send(packet1);

}

//关闭资源

socket.close();

System.out.println(“Receiver关闭”);

}

}

发送端代码:

package com.hsp.net.homework;

import java.io.IOException;

import java.net.*;

import java.util.Scanner;

/**

  • Description

  • User:

  • Date:

  • Time:

最后

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。

image

请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析

data, 0, length);

byte[] bytes1 = “红楼梦…”.getBytes();

byte[] bytes2 = “what”.getBytes();

if(“四大名著是哪些”.equals(s)){

System.out.println(“进入”);

DatagramPacket packet1 = new DatagramPacket(bytes1,bytes1.length, InetAddress.getByName(“192.168.10.1”),9998);

socket.send(packet1);

}else{

DatagramPacket packet1 = new DatagramPacket(bytes2,bytes2.length, InetAddress.getByName(“192.168.10.1”),9998);

socket.send(packet1);

}

//关闭资源

socket.close();

System.out.println(“Receiver关闭”);

}

}

发送端代码:

package com.hsp.net.homework;

import java.io.IOException;

import java.net.*;

import java.util.Scanner;

/**

  • Description

  • User:

  • Date:

  • Time:

最后

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。

[外链图片转存中…(img-LecsHF7D-1714389352741)]

请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值