Java—— TCP协议(相关代码实现以及相关优化)

代码运行的时候先运行服务端,然后在运行客户端

 * 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集装箱
}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/379838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是adsense 想通过广告挣钱的看过来

Adsense的含义Google AdSense是由Google公司推出的针对网站主(简称发布商)的一个互联网广告服务。AdSense是个合成词。其中ad是“广告”之意,sense是“感知”之意,综合起来的意思就是相关广告。Google通过程序来分析网站的内容&am…

Java GregorianCalendar getTimeZone()方法与示例

GregorianCalendar类的getTimeZone()方法 (GregorianCalendar Class getTimeZone() method) getTimeZone() method is available in java.util package. getTimeZone()方法在java.util包中可用。 getTimeZone() method is used to return the time zone for this GregorianCale…

python安全攻防---信息收集---ICMP主机探测 以及optionparser的使用

0x01 基础概念 ICMP(Internet control Message Protocal)Internet报文协议,是TCP/IP的一种子协议,属于网络层协议,其目的是用于在IP主机、路由器之间传递控制信息 0x02 程序 程序 # -*- coding:utf-8 -*- from sca…

PHP文件系统-文件下载

一、网页请求和响应的过程 请求: 1. HTTP 1.1 协议 版本 2. 头信息,请求的ip,其他 3. 你请求的表单信息, 你提交给服务器的信息 http://localhost/one.php?aabbb&cccdd 响应: 1. 状态 200 ok 404 页面没找到 2. 响应头信息&a…

Java——网络编程练习

练习一(黑马程序员面试题):客户端向服务器写字符串(键盘录入),服务器(多线程)将字符串反转后写回,客户端再次读取到的是反转后的字符串 相关代码如下: package com.wsq.test;import java.io.BufferedReader; import java.io.Buf…

第一章 基础知识---1.4Crack小实验--复现

0x01 程序及其编译环境 程序如下&#xff0c;功能&#xff1a;我们必须输入正确的密码1234567才能得到密码验证的确认&#xff0c;跳出循环。否则程序提示密码错误再次输入。 #include <stdio.h>#define PASSWORD "1234567"int verify_password(char* passwo…

.net中调用exchange服务器发邮件

普通的邮件, 用System.Net.Mail 类 或 System.Web.Mail 类 处理即可, 但是Exchange Server 环境下, 这两个类起不了作用-------至少目前我看到的情况如此. 整个过程如下: 1. 先添加COM 引用 "Microsoft CDO for Windows 2000 Library" .2. 发送邮件的代码: CDO.Messa…

Java Double类doubleToLongBits()方法与示例

Double类doubleToLongBits()方法 (Double class doubleToLongBits() method) doubleToLongBits() method is available in java.lang package. doubleToLongBits()方法在java.lang包中可用。 doubleToLongBits() method follows IEEE 754 double floating-point standards and …

Firefox(火狐浏览器)彩蛋

①在地址栏上输入&#xff1a; about:mozilla ②在地址栏上输入&#xff1a; about:robots ③在地址栏上输入&#xff1a; www.figma.com/404/ ④地址栏上输入&#xff1a; chrome://global/content/alerts/alert.xul

jquery.history插件在ie中失效的问题

hash标志中不能有? ff中不存在这个问题。 转载于:https://www.cnblogs.com/xyun/archive/2008/12/01/1345188.html

Java——反射(Class.forName()读取配置文件举例).

榨汁机(Juicer)榨汁机的案例&#xff1a; 分别有水果(Fruit),苹果(Apple)&#xff0c;香蕉(Bananal)&#xff0c;橘子(Orange),榨汁(squeeze) 要求&#xff1a; 榨出不同的水果汁来喝 //一般方法求解 package com.testl;public class Text1 {public static void main(Strin…

java 根据类名示例化类_Java类类getEnclosingClass()方法及示例

java 根据类名示例化类类的类getEnclosingClass()方法 (Class class getEnclosingClass() method) getEnclosingClass() method is available in java.lang package. getEnclosingClass()方法在java.lang包中可用。 getEnclosingClass() method is used to return recent or im…

C++:cin.getline

转&#xff1a;百度百科 http://baike.baidu.com/view/2383876.htm cin.getline 此函数是按行读取,其语法为:cin.getline(字符指针,字符个数N,结束符); 功能是&#xff1a;一次读取多个字符(包括空白字符&#xff09;&#xff0c;直到读满N-1个&#xff0c;或者遇到指定的结束符…

端口复用和重映射--STM32F103

什么是端口复用&#xff1f; STM32中有很多内置外设&#xff0c;这些外设的引脚都是与GPIO复用的&#xff0c;什么时候复用呢&#xff1f;就是当一个GPIO作为内置外设引脚使用时&#xff0c;就叫做复用。比如串口1的发送接收引脚是PA9&#xff0c;PA10&#xff0c;当PA9&#…

考研数学

眼前俨然一副冬的气象&#xff0c;伴随气温的骤降&#xff0c;考研复习也进入异常紧张的阶段。在考试前这两个月里&#xff0c;考生如何复习数学&#xff0c;成绩还可以有所提高。万学?海文数学教研组针对冲刺阶段数学复习归纳总结以下复习经验和建议&#xff0c;供大家参考。…

一个很好的自学网站~推荐一下

http://www.51zxw.net/study.asp?vip15746908

[转]Ubuntu远程桌面登陆

原文地址&#xff1a;http://www.cnblogs.com/xdzone/archive/2011/03/10/1979644.html 1.xp下默认的远程桌面协议是rdp&#xff0c;默认端口3389&#xff0c;而ubuntu用的时vnc&#xff1a;默认端口5900 2.首先被访问的主机&#xff08;windows/linux&#xff09;都要设置为允…

NVIC中断管理---STM32

NVIC&#xff1a;嵌套向量中断控制器 在了解中断之前&#xff0c;我们先了解抢占优先级和响应优先级 抢占优先级和响应优先级 抢占优先级决定能不能打断&#xff0c;高优先级的抢占可以中断低优先级的抢占响应优先级在抢占优先级相同时&#xff0c;高响应优先级先执行&#x…

Java BigDecimal stripTrailingZeros()方法与示例

BigDecimal类stripTrailingZeros()方法 (BigDecimal Class stripTrailingZeros() method) stripTrailingZeros() method is available in java.math package. stripTrailingZeros()方法在java.math包中可用。 stripTrailingZeros() method is used to get a BigDecimal that is…

外部中断---STM32F1

外部中断概述 STM32的中断控制器支持19个外部中断/事件请求&#xff1a; 线0-15&#xff1a;对应外部IO口的输入中断线16&#xff1a;连接到PVD输出线17&#xff1a;连接到RTC闹钟事件线18&#xff1a;连接到USB唤醒事件 STM32每个IO口都有可以作为外部中断输入&#xff0c;…