代码运行的时候先运行服务端,然后在运行客户端
* 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();
}}