做网站云服务器还是云虚拟主机,百度新闻源网站有哪些,花钱做推广广告哪个网站好,网站导航栏制作代码运行的时候先运行服务端#xff0c;然后在运行客户端 * TCP协议#xff1a;* 1#xff0c;客户端* 创建Socket连接服务器(指定IP地址#xff0c;端口号)通过IP地址找到对应的服务器* 调用Socket的getInputStream()和getOutputStream()方法获取和服务器端相连…代码运行的时候先运行服务端然后在运行客户端 * TCP协议* 1客户端* 创建Socket连接服务器(指定IP地址端口号)通过IP地址找到对应的服务器* 调用Socket的getInputStream()和getOutputStream()方法获取和服务器端相连的IO流* 输入流可以读取服务器端输出流写出的数据* 输出流可以写出数据到服务端的输入流* * 2服务端* 创建ServerSocket(需要指定端口号)* 调用ServerSocket的accept()方法接受一个客户端请求得到一个Socket* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流* 输入流可以读取客户端输出流写出的数据* 输出流可以写出数据到客户端的输入流
package com.wsq.tcp;
//java com.wsq.tcp.Demo1_Client
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); //创建Socket集装箱对象wsq并且指定想要发送他人的IP和对应的端口号连接服务器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(); //关闭集装箱对象wsq}
}
package com.wsq.tcp;
//java com.wsq.tcp.Demo2_Server
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); //创建ServerSocket并且指定端口号 Socket wsq server.accept(); //接收客户端的请求创建集装箱对象wsq调用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(); //关闭socket集装箱}
}由上面的例子可以看出该程序有点弊端例如读写的时候特别费劲写的时候得把字符串转成字节数组给写出去读取的时候需要创建一个字节数组然后才能读进来然后再转换成字符串
优化读的时候是字符串写的时候也是字符串这样会简便很多
优化代码如下
package www.wsq.TCP;
import java.io.BufferedReader;
//java com.wsq.tcp.Demo1_Client
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); //创建Socket集装箱对象wsq并且指定想要发送他人的IP和对应的端口号连接服务器BufferedReader br new BufferedReader(new InputStreamReader(wsq.getInputStream())); //将字节流包装成为字符流PrintStream ps new PrintStream(wsq.getOutputStream()); //PrintStream中有写出换行的方法 //将getInputStream()这个输入字节流和getOutputStream()这个输出字节流进行包装包装之后就可以直接读一行也可以直接写出字符串这样的话效率会更高//对于getInputStream()这个输入字节流输入想整行读用BufferedReader因为BufferedReader里面有ReadLine方法//对于getOutputStream()这个输出字节流这里不建议用BufferedWriter进行包装因为BufferedWriter里面有个ReadLine方法这个方法是以/r/n进行结束的写完之后还得调用newLine方法//这里建议用一个更好的流PrintStream对getOutputStream()这个输出字节流进行包装该流里面有个printLine方法这个方法使你在写出的时候直接加换行的而且这个PrintLine方法也可以直接写字符串System.out.println(br.readLine()); //读出内容ps.println(滚mmp);System.out.println(br.readLine()); //读出内容ps.println(呵呵你该呗儿厉害了~);wsq.close(); //关闭集装箱对象wsq}}
有常识可知服务端是多线程的
package www.wsq.TCP;
import java.io.BufferedReader;
//java com.wsq.tcp.Demo2_Server
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); //创建ServerSocket并且指定端口号 while(true){ //不断地接收客户端的请求final Socket wsq server.accept(); //接收客户端的请求创建集装箱对象wsq调用accept方法来接收客户端向服务端发出的请求//匿名内部类具备变量必须被final修饰new Thread(){ //每接收到客户一条请求就开启一条线程运用匿名内部类进行开启线程public void run(){try {BufferedReader br new BufferedReader(new InputStreamReader(wsq.getInputStream())); //将字节流包装成为字符流PrintStream ps new PrintStream(wsq.getOutputStream()); //PrintStream中有写出换行的方法 ps.println(欢迎来到哈哈哈哈我也不知道这是哪~~);System.out.println(br.readLine()); //readLine是以\r\n为结束标志的没有换行该行代码就不会结束ps.println(你让我怎样我就怎样我的面子往哪放我就不);System.out.println(br.readLine()); //读出信息内容} catch (IOException e) {e.printStackTrace();}}}.start();wsq.close(); //关闭socket集装箱}}private static void demo1() throws IOException {ServerSocket server new ServerSocket(1014); //创建ServerSocket并且指定端口号 Socket wsq server.accept(); //接收客户端的请求创建集装箱对象wsq调用accept方法来接收客户端向服务端发出的请求BufferedReader br new BufferedReader(new InputStreamReader(wsq.getInputStream())); //将字节流包装成为字符流PrintStream ps new PrintStream(wsq.getOutputStream()); //PrintStream中有写出换行的方法 ps.println(欢迎来到哈哈哈哈我也不知道这是哪~~);System.out.println(br.readLine()); //readLine是以\r\n为结束标志的没有换行该行代码就不会结束ps.println(你让我怎样我就怎样我的面子往哪放我就不);System.out.println(br.readLine());wsq.close(); //关闭socket集装箱
}}