1.TCP/IP协议
三次握手
1.客户端请求服务器,等待服务器确认
2.服务端回应客户端,通知连接
3.客户端再次请求服务器,进行连接确认
1.1 IP地址
IPv4:32位的二进制数,分为4个字节,a.b.c.d 的形式 0~255
ipv6:
常用的命令
ipconfig 本机IP
ping 空格 IP地址 网络是否联通
1.2 端口号
2.TCP通信
2.1 Socket类
public static void main(String[] args) throws IOException {
//1.创建socket用于连接服务器
Socket socket = new Socket("localhost",8888);
//2.获取写流(输出流,开始写东西),
OutputStream os = socket.getOutputStream();
os.write("你好服务器2222!".getBytes());
os.flush();
//3.获取读流(输入流,开始读东西)
InputStream is = socket.getInputStream();
byte []bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));
//4.释放资源
socket.close();
}
2. ServerSocket类
注意,Socket的InputStream在读取到null后会进入阻塞状态,所以在写流结束后应该调用sss告诉流,结束。
public static void main(String[] args) throws IOException {
//1.获取ServerSocket用于获取客户端的socket
ServerSocket server = new ServerSocket(8888);
Socket socket = server.accept();
//2.读取客户端发送的消息
InputStream is = socket.getInputStream();//读取数据的流,也叫输入流
byte []bytes = new byte[1024];
int read = is.read(bytes);
System.out.println(new String(bytes,0,read));
//3.给客户端返回消息
OutputStream os = socket.getOutputStream();//写数据的流,也叫输出流
os.write("服务器接收到消息!".getBytes());
os.flush();
//4.释放资源
socket.close();
server.close();
}
3. 小练习文件上传
1.服务端代码
package mode06;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
/**
* 服务器类
*/
public class CopServer {
public static void main(String[] args)throws IOException{
openServer("D:\\word\\f");
}
/**
* 保存文件的方式
* @param filePath
* 1.
*/
private static void openServer(String filePath) throws IOException{
final int path = 8888;//定义一个常量带表服务器端口号
ServerSocket server = new ServerSocket(path);//获取server
while(true){//获取多个客户端
Socket socket = server.accept();//1.获取socket,注意在确认有客户端访问之前什么也别做
new Thread(()-> {//开启线程,使得效率更高
InputStream is = null;
File file = new File(filePath);//创建文件夹
if (!file.isDirectory()) file.mkdirs();//如果文件夹不存在,就创建
String fileName = "zpx"+System.currentTimeMillis()+new Random().nextInt(9999)+".jpg";//文件名
FileOutputStream fos = null;//文件输出流,写文件
try {
fos = new FileOutputStream(file+"\\"+fileName);//定义写文件
is = socket.getInputStream();//2.获取socket输入流
int len = 0;
byte []bytes = new byte[1024];
while((len = is.read(bytes))!=-1){
fos.write(bytes);//3.将获取到的字符流写入到文件输出流中
}
}catch(IOException e){
System.out.println(e.toString());
}finally{
try {
fos.close();
socket.close();//4.关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
2.客户端
package mode06;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class CopSocket {
public static void main(String[] args) throws IOException {
show();
show();
show();
}
private static void show() throws IOException{
Socket socket = new Socket("localhost",8888);
OutputStream os = socket.getOutputStream();
File file = new File("D:\\word\\c\\d");
FileInputStream fis = new FileInputStream(file+"\\timg (2).jpg");
int len = 0;
byte []bytes = new byte[1024];
while ((len = fis.read(bytes))!= -1){
os.write(bytes);
}
socket.shutdownOutput();
}
}