TCP通信分析图解
1.【服务端】启动,创建ServerSocket对象,等待连接。
2.【客户端】启动,创建Socket对象,请求连接。
3.【服务端】接收连接,调用accept方法,并返回一个Socket对象。
4.【客户端】Socket对象,获取OutputStream,向服务端写出数据。
5.【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。
客户端(发送数据)操作步骤
1.创建Socket的对象
2.获取IO流对象(输出)
3.写数据
4.释放资源
Socket clickSocket = new Socket("IP地址",端口号);
OutputStream os = clickSocket.getOutputStream();
os.write("需要写入的数据"); //可以进行流的增强
os.close();
服务端(接收数据)操作步骤
1.创建ServerScoket对象
2.连接客户端Socket对象
3.获取IO流对象(输入)
4.读数据
5.释放资源
ServerSocket serverSocket = new ServerSocket(端口号);
Socket clientSocket = serverSocket.accept();
InputStream is = clickSocket.getInputStream();
int ch = is.read(); //可以进行流的增强
is.close();
服务端(回复数据)操作步骤
1.获取IO流对象(输出)
2.写数据
3.释放资源
4.关闭客户端socket
OutputStream os = clientSocket.getOutputStream();
os.write("需要写回的数据"); //可以进行增强流
os.close();
clickSocket.close();
客户端(接收数据)操作步骤
1.获取IO流对象(输入)
2.读数据
3.释放资源
4.关闭客户端socket
InputStream is = clickSocket.getInputStream();
int ch = is.read(); //可以进行流的增强
is.close();
clickSocket.close();
文件上传分析图解
1.【客户端】输入流,从硬盘读取文件数据到程序中。
2.【客户端】输出流,写出文件数据到服务端。
3.【服务端】输入流,读取文件数据到服务端程序。
4.【服务端】输出流,写出文件数据到服务器硬盘中。
客户端
public class ClientDemo {
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("C:\\Users\\zk\\Desktop\\课表.png");
Socket cs = new Socket("127.0.0.1",4444);
OutputStream os = cs.getOutputStream();
int len ;
byte[] arr = new byte[1024];
while ((len = fis.read(arr)) != -1){
os.write(arr,0,len);
}
//客户端通知服务器数据书写完毕
cs.shutdownOutput();
BufferedReader br = new BufferedReader(new InputStreamReader(cs.getInputStream()));
String s = br.readLine();
System.out.println("s = " + s);
cs.close();
fis.close();
}
}
服务器端
public class ServerDemo {
public static void main(String[] args) throws IOException {
System.out.println("服务器打开了");
ServerSocket ss = new ServerSocket(4444);
//使用死循环一直开启服务器
while(true){
Socket cs = ss.accept();
//创建多线程提高效率
new Thread(new Runnable() {
@Override
public void run() {
try {
upload(cs);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
/**
* 上传文件
* @param cs
* @throws IOException
*/
private static void upload(Socket cs) throws IOException {
//使用System.currentTimeMillis()保证每次上传的图片名不重复
String path = "myday11\\mydir\\"+System.currentTimeMillis()+".png";
FileOutputStream fos = new FileOutputStream(path);
InputStream is = cs.getInputStream();
byte[] arr = new byte[1024];
int len;
while ((len = is.read(arr)) != -1){
fos.write(arr,0,len);
}
cs.getOutputStream().write("上传成功".getBytes());
fos.close();
cs.close();
}
}
注意事项
1.IP地址如果写错
处于一种等待的状态. 最终出现 连接超时的情况 Connection timed out: connect
2.端口号如果写错
直接拒绝访问. 出现 java.net.ConnectException: Connection refused: connect
3.服务器重复运行两次及以上
端口号已经被占用了,不能重复使用 java.net.BindException: Address already in use: NET_Bind