前言`
bio通讯学习笔记,从简单案例到复杂案例
一、简单案例
1.客户端
代码如下(示例):
package com.xuexi.testSocket.one2;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
// 创建socket请求连接
socket = new Socket("127.0.0.1",9999);
// socket = new Socket("192.168.0.109",9999); // 联想g50-70
// 从socket中获取字节输出流
OutputStream os = socket.getOutputStream();
// 把字节流包装成打印流
PrintStream ps = new PrintStream(os);
Scanner sn = new Scanner(System.in);
while(true){
System.out.print("请说:");
String msg = sn.nextLine();
ps.println(msg);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.服务端
代码如下(示例):
package com.xuexi.testSocket.one2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
System.out.println("启动服务器。。。");
// 定义服务端端口注册
ServerSocket ss = new ServerSocket(9999);
// 监听客户端socket连接请求
Socket socket = ss.accept();
// 从socket管道中得到一个字节流输入对象
InputStream is = socket.getInputStream();
// 把字节流组装成一个缓冲字符输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String smg;
while ((smg = br.readLine()) != null){
System.out.println("服务器收到:"+smg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、多线程方式
1.客户端
代码如下(示例):
package com.xuexi.testSocket.one3;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
// 创建socket请求连接
socket = new Socket("127.0.0.1",9999);
// 从socket中获取字节输出流
OutputStream os = socket.getOutputStream();
// 把字节流包装成打印流
PrintStream ps = new PrintStream(os);
Scanner sn = new Scanner(System.in);
while(true){
System.out.print("请说:");
String msg = sn.nextLine();
ps.println(msg);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.服务端
代码如下(示例):
package com.xuexi.testSocket.one3;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
System.out.println("启动服务器。。。");
// 定义服务端端口注册
ServerSocket ss = new ServerSocket(9999);
// 定义死循环,负责不断接收客户端的socket请求
while (true){
// 监听客户端socket连接请求
Socket socket = ss.accept();
// 创建多线程,每次处理客户端都新建一个连接
new ServerThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.xuexi.testSocket.one3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ServerThread extends Thread{
private Socket socket;
public ServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
InputStream is = null;
try {
// 从socket中获取字节流
is = socket.getInputStream();
// 使用缓冲字符流包装字节流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String meg;
while((meg = br.readLine()) != null){
System.out.println(meg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、线程池方式
1.客户端
代码如下(示例):
package com.xuexi.testSocket.one4;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
// 创建socket请求连接
socket = new Socket("127.0.0.1",9999);
// 从socket中获取字节输出流
OutputStream os = socket.getOutputStream();
// 把字节流包装成打印流
PrintStream ps = new PrintStream(os);
Scanner sn = new Scanner(System.in);
while(true){
System.out.print("请说:");
String msg = sn.nextLine();
ps.println(msg);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.服务端
代码如下(示例):
package com.xuexi.testSocket.one4;
import com.atguigu.testSocket.one3.ServerThread;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
System.out.println("启动服务器。。。");
// 定义服务端端口注册
ServerSocket ss = new ServerSocket(9999);
// 初始化线程池对象
HandlerSocketServerPool pool = new HandlerSocketServerPool();
// 定义死循环,负责不断接收客户端的socket请求
while (true){
// 监听客户端socket连接请求
Socket socket = ss.accept();
// 把socket对象交给线程池处理
Runnable target = new ServerRunnableTarget(socket);
pool.execute(target);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.xuexi.testSocket.one4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class HandlerSocketServerPool{
// 创建一个线程池,
private ExecutorService executorService;
// 初始化线程池对象
public HandlerSocketServerPool(){
this.executorService = new ThreadPoolExecutor(2,2,120,
TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(2));
}
// 提供一个方法来提交任务给线程池的任务队列来暂存,等着线程池来处理
public void execute(Runnable target){
executorService.execute(target);
}
}
package com.xuexi.testSocket.one4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ServerRunnableTarget implements Runnable{
private Socket socket;
public ServerRunnableTarget(Socket socket){
this.socket = socket;
}
@Override
public void run() {
InputStream is = null;
try {
// 从socket中获取字节流
is = socket.getInputStream();
// 使用缓冲字符流包装字节流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String meg;
while((meg = br.readLine()) != null){
System.out.println("服务器接收到:"+meg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}