OutputStream getOutputStream(): 获取客户端的字节输出流对象,用来给服务器端发送请求信息
InputStream getInputStream(): 获取客户端的字节输入流对象,用读取服务器端发送回来的响应信息
客户端 构造方法: public Socket(String host, int port)
参数: String host: 客户端要连接的服务器端的ip地址 int port: 客户端要连接的服务器端的端口号
注意: 只要创建客户端Socket对象,就会完成与服务器端的三次握手,建立与服务器端的连接
服务器 构造方法: ServerSocket(int port)
参数: int port: 端口号,必须和客户端访问的端口号保持一致
注意: 服务器端不用指定ip地址,在哪台机器上运行,就是用该机器的ip地址
Socket accept(): 服务器端获取到连接服务器的客户端的Socket对象
能够编写TCP协议下字符串数据传输程序
客户端
public class Demo02Client {
public static void main(String[] args) throws IOException {
Socket client = new Socket("127.0.0.1",6666);
OutputStream netOs = client.getOutputStream();
netOs.write("老师在吗?我今天迟到了?.....".getBytes());
InputStream netIs = client.getInputStream();
byte[] bs = new byte[1024];
int len = 0;
len = netIs.read(bs);
System.out.println("客户端收到服务器端的响应信息: "+new String(bs,0,len));
netIs.close();
netOs.close();
client.close();
}
}
服务端
public class Demo03Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(6666);
Socket client = server.accept();
InputStream netIs = client.getInputStream();
int len = 0;
byte[] bs = new byte[1024];
len = netIs.read(bs);
System.out.println("服务器端接收到客户端的请求信息: "+new String(bs,0,len));
OutputStream netOs = client.getOutputStream();
netOs.write("迟到真不应该,按照之前的承诺,那你来选择: 1.唱歌 2.跳舞...".getBytes());
netOs.close();
netIs.close();
client.close();
server.close();
}
}
能够理解TCP协议下文件上传案例--多线程版本(手动开启线程)
问题1: 修改客户端代码 客户端没有读取到服务器端的"文件上传成功" 响应信息
解决方案: shutDownOutputStream():
销毁客户端的字节输出流,相当于给服务 器发送-1
问题2:修改服务器端代码 在服务器端保存文件时,随机生成不重复的文件名
问题3多线程 可以利用线程池进行再次优化。
public class MyUploadFileTask implements Runnable {
private Socket client;
public MyUploadFileTask(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
InputStream netIs = client.getInputStream();
String fileName = System.currentTimeMillis()
+new Random().nextInt()+ ".flv";
OutputStream fos =
new FileOutputStream(new File("day12\\upload\\to",fileName));
int len = 0;
byte[] bs = new byte[1024];
while ((len = netIs.read(bs)) != -1) {
fos.write(bs,0,len);
}
OutputStream netOs = client.getOutputStream();
netOs.write("文件上传成功!!!!!!!!".getBytes());
netOs.close();
netIs.close();
fos.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器改为多线程版本:使用线程池完成
public class Demo06UpLoadServer {
public static void main(String[] args) throws IOException {
ExecutorService es = Executors.newFixedThreadPool(80);
ServerSocket server = new ServerSocket(7777);
while(true) {
Socket client = server.accept();
es.submit(new MyUploadFileTask(client));
}
}
}
--