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

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

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

  1. java tcp ip通信_Java中Socket实现TCP/IP协议的通信

    TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的. Jav ...

  2. 机器学习的相关代码汇总

    机器学习的相关代码汇总 文章目录 机器学习的相关代码汇总 机器学习相关代码汇总 XGBoost 示例1 示例2 SVM 示例1 示例二 EM 示例1 示例二:GMM 贝叶斯网络 示例一 LDA 机器学 ...

  3. 网络编程 socket模块 tcp协议 udp协议

    网络基础相关知识 , socket模块 , tcp协议通信代码 , tcp和udp编码流程 网络基础相关知识(1) 架构 C / S 架构: client 客户端 和 server 服务器端 优势:能 ...

  4. tcp网络通信教程 java_基于java TCP网络通信的实例详解

    JAVA中设计网络编程模式的主要有TCP和UDP两种,TCP是属于即时通信,UDP是通过数据包来进行通信,UDP当中就会牵扯到数据的解析和传送.在安全性能方面,TCP要略胜一筹,通信过程中不容易出现数 ...

  5. Java TCP 编程简介

    一.TCP 协议简介 http://blog.csdn.net/nvd11/article/details/40954043 之前的博文简单介绍了网络编程中的UDP协议 其实更常用的网络协议是TCP协 ...

  6. java 树状数据算法_使用递归算法结合数据库解析成Java树形结构的代码解析

    这篇文章主要介绍了使用递归算法结合数据库解析成Java树形结构的代码解析的相关资料,需要的朋友可以参考下 1.准备表结构及对应的表数据 a.表结构:create table TB_TREE ( CID ...

  7. JAVA 网络编程流相关代码(UDP和TCP)

    UDP传输 UDP传输示例代码1 功能需求:通过udp传输方式,将一段文字数据发送出去. 定义一个udp发送端. 思路: 1,建立updsocket服务. 2,提供数据,并将数据封装到数据包中. 3, ...

  8. Linux——TCP协议与相关套接字编程

    一.TCP协议概念 与UDP协议相同,TCP协议也是应用在传输层的协议.虽然都是应用在传输层,但是使用方式和应用场景上大不一样.TCP协议具有:有连接(可靠).面向字节流的特点. (一).有连接 所谓 ...

  9. ffmpeg中的http协议相关代码阅读笔记

    ffmpeg中的http协议相关代码阅读笔记 今天闲来无事,尝试看了下ffmpeg中的相关http协议传输处理代码 先简单说下这个代码在整个仓库里面的位置: ffmpeg/libavformat/ht ...

最新文章

  1. 第166天:canvas绘制饼状图动画
  2. mac系统下,解决git clone速度慢导至失败的问题
  3. Tom Ryaboi
  4. 我不愿意直接表达情绪:答上海《新闻晨报》记者顾筝小姐问
  5. 零信任策略下云上安全信息与事件管理实践
  6. weboffice集成
  7. JVM致命错误日志 hs_err_pid.log的分析
  8. 关闭MyEclipse右侧工具栏
  9. 计算机摄影采用的成像媒介,探讨computed tomography的中文名称
  10. python计算日期到天数_利用python计算时间差(返回天数)
  11. 触摸屏分屏拓展屏软件(可自定义界面)
  12. java.lang.SecurityException: getDeviceId: The user 10158 does not meet the requirements to access de
  13. 使用python下载网站视频资源
  14. 9.28javaweb
  15. 电脑微信截屏快捷键怎么取消
  16. bq30z55调试常见故障排除
  17. ai人工智能软件开发模式介绍
  18. pro unity xl编程手册_UnityProXL编程入门指南资料
  19. 12V恒压转5V 2.5A小封装SOT23大电流同步降压芯片
  20. IntelliJ IDEA 14,15 使用教程,实战总结,倾囊相授,内附PDF学习文档

热门文章

  1. 服务器物理部署拓扑图,【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(五)-物理服务器路由方案及配置...
  2. Angular网络请求的封装
  3. The Pilots Brothers' refrigerator
  4. Python操作Redis(转)
  5. shipyard-----------docker容器的可视化管理
  6. flask框架基本使用(2)(响应与重定向)
  7. How to fix the bug “Expected required, optional, or repeated.”?
  8. 用C#来学习唐诗三百首和全唐诗
  9. MSSQL-字符串分离与列记录合并成一行混合使用
  10. myeclipse5.5注册码