标签:弊端 就是 方法 服务 标识 必须 输出流 sys 缓冲
在整个过程中,需要注意的是随时刷新缓冲区和关闭流,所以推荐使用打印流,会自动刷新和自动换行.
写个小例子,实现客户端和服务端的单次通信
package homework.demo5;
import java.io.*;
import java.net.Socket;
/**
* 创建客户端
*
* @author WZLOVE
* @create 2018-07-25 20:47
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建Socket对象
Socket socket = new Socket("localhost",8888);
// 利用转换流转换成打印流
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
// 向服务器写内容
pw.println("你好,我是客户端");
// 获取高效字符输入流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 获取服务器发送的消息
String s = br.readLine();
System.out.println("服务器说:" + s);
// 关闭流
socket.close();
}
}
package homework.demo5;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
*
* @author WZLOVE
* @create 2018-07-25 20:57
*/
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建服务端网络对象,指定端口号
ServerSocket ss = new ServerSocket(8888);
// 获取Socket对象
Socket accept = ss.accept();
// 获取高效输入流
BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
// 获取输入的信息
String s = br.readLine();
System.out.println("客户端说 : " + s);
// 获取打印流
PrintWriter pw = new PrintWriter(new OutputStreamWriter(accept.getOutputStream()),true );
// 向客户端发送消息
pw.println("你好,我是服务端");
// 关闭资源
accept.close();
ss.close();
}
}
写个例子,实现客户端向服务器上传图片
package homework.demo7;
import java.io.*;
import java.net.Socket;
/**
* 网络通信中的客户端
*/
public class Cilent {
public static void main(String[] args) throws IOException {
// 创建Socket客户端对象
Socket socket = new Socket("localhost",8888);
// 准备文件进行传输
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("yz.jpg"));
// 使用socket对象获取字节输入流对象
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
// 一边读文件,一边向服务器发送数据
byte[] arr = new byte[1024 * 5];
int len;
while((len = bis.read(arr)) != -1){
bos.write(arr,0,len);
}
// 数据上传完毕,刷新缓存区
bos.flush();
// 关闭不用的资源
bis.close();
// 关闭输出流套接字,这个步骤是必须的
socket.shutdownOutput();
// 读取反馈的数据
// 使用socket对象获取字节输入流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null){
sb.append(line);
}
System.out.println(sb);
// 关闭资源
socket.close();
}
}
package homework.demo7;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
*/
public class Server {
public static void main(String[] args) throws IOException {
// 创建服务端的对象
ServerSocket ss = new ServerSocket(8888);
// 使用服务端对象获取Socket对象
Socket accept = ss.accept();
// 准备接受上传的文件并且写入服务器
// 创建高效字节输出流,用来指向文件
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.jpg"));
// 使用socket对象获取文件字节输入流(转化为高效字节输入流)
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
// 边读边写
byte[] arr = new byte[1024 * 5];
int len;
while((len = bis.read(arr)) != -1){
bos.write(arr,0,len);
// 进行刷新
bos.flush();
}
// 关闭不使用的资源
bos.close();
// 向客户端反馈信息
PrintWriter pw = new PrintWriter(new OutputStreamWriter(accept.getOutputStream()),true);
// 写信息
pw.println("上传成功");
// 关闭资源
accept.close();
ss.close();
}
}
有关网络的相关知识大家可以去订阅极客时间上的趣谈网络协议,那个讲的很清楚
标签:弊端 就是 方法 服务 标识 必须 输出流 sys 缓冲
原文地址:https://www.cnblogs.com/wadmwz/p/9377145.html