代码运行的时候先运行服务端,然后在运行客户端
* TCP协议:
* 1,客户端
* 创建Socket连接服务器(指定IP地址,端口号)通过IP地址找到对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务器端相连的IO流
* 输入流可以读取服务器端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
*
* 2,服务端
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接受一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流
package com.wsq.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Demo1_Client {
/**
* 1,客户端
* 创建Socket连接服务器(指定IP地址,端口号不超过65535)通过IP地址找到对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务器端相连的IO流
* 输入流可以读取服务器端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
* @throws IOException
* @throws UnknownHostException
*
*
* */
public static void main(String[] args) throws UnknownHostException, IOException {
Socket wsq = new Socket("192.168.1.182",1014);
InputStream is = wsq.getInputStream();
OutputStream os = wsq.getOutputStream();
byte [] arr = new byte [1024];
int len = is.read(arr);
System.out.println(new String (arr,0,len));
os.write("客户端对服务端发送请求:傻孩纸,还在睡呢?".getBytes());
wsq.close();
}
}
package com.wsq.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo2_Server {
/**
* * 2,服务端
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接受一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流
* @throws IOException
*
* */
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(1014);
Socket wsq= server.accept();
InputStream is = wsq.getInputStream();
OutputStream os = wsq.getOutputStream();
os.write("服务端响应客户端没,刚睡醒,不想理你".getBytes());
byte [] arr = new byte [1024];
int len = is.read(arr);
System.out.println(new String (arr,0,len));
wsq.close();
}
}
由上面的例子可以看出,该程序有点弊端,例如:读写的时候特别费劲,写的时候得把字符串转成字节数组给写出去,读取的时候,需要创建一个字节数组,然后才能读进来,然后再转换成字符串
优化:读的时候是字符串,写的时候也是字符串,这样会简便很多
优化代码如下:
package www.wsq.TCP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Demo1_Client {
/**
* 1,客户端
* 创建Socket连接服务器(指定IP地址,端口号不超过65535)通过IP地址找到对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务器端相连的IO流
* 输入流可以读取服务器端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
* @throws IOException
* @throws UnknownHostException
*
*
* */
public static void main(String[] args) throws UnknownHostException, IOException {
Socket wsq = new Socket("192.168.1.182",1014);
BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream()));
PrintStream ps = new PrintStream(wsq.getOutputStream());
System.out.println(br.readLine());
ps.println("滚,mmp");
System.out.println(br.readLine());
ps.println("呵呵,你该呗儿厉害了~");
wsq.close();
}
}
有常识可知,服务端是多线程的
package www.wsq.TCP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo2_Server {
/**
* * 2,服务端
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接受一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流
* @throws IOException
*
* */
public static void main(String[] args) throws IOException {
demo1();
ServerSocket server = new ServerSocket(1014);
while(true){
final Socket wsq= server.accept();
new Thread(){
public void run(){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream()));
PrintStream ps = new PrintStream(wsq.getOutputStream());
ps.println("欢迎来到哈哈哈哈我也不知道这是哪~~");
System.out.println(br.readLine());
ps.println("你让我怎样我就怎样,我的面子往哪放?我就不");
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
wsq.close();
}
}
private static void demo1() throws IOException {
ServerSocket server = new ServerSocket(1014);
Socket wsq= server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream()));
PrintStream ps = new PrintStream(wsq.getOutputStream());
ps.println("欢迎来到哈哈哈哈我也不知道这是哪~~");
System.out.println(br.readLine());
ps.println("你让我怎样我就怎样,我的面子往哪放?我就不");
System.out.println(br.readLine());
wsq.close();
}
}