自己动手写简单的web应用服务器(1)—tcp通信

1.socket简介:

socket通常称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定在一个端口上,不同的端口对应不同的服务。

应用程序通常通过"套接字",向网络发出请求或者应答网络请求。socket和serverSocket类位于java.net包中。serverScoket用于服务端,socket是建立网络连接时使用的。连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话。

2.获取地址和端口号:

通过socket可以获取获取本地地址和端口号,以及远程地址和端口号。

服务器端源码:

 

 1 package socket;
 2 
 3 import java.net.InetAddress;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 
 7 public class Server {
 8     public static void main(String[] args) throws Exception {
 9         //创建serverSocket,并申请8080端口
10         ServerSocket ss = new ServerSocket(8080);
11         //阻塞方法,直到某个Socket连接。连接成功,产生Socket实例。
12         Socket s = ss.accept();
13         int localPort = s.getLocalPort();//获取本地端口
14         InetAddress localAdd = s.getLocalAddress();//获取套接字绑定的本地地址IP
15         String hostName = localAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名
16         String hostAddress = localAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。
17         System.out.println("本地端口为:"+localPort);
18         System.out.println("本地IP地址的完全限定域名:"+hostName);
19         System.out.println("本地IP的字符串为:"+hostAddress);
20         System.out.println("*************分割符*****************");
21         int port = s.getPort();//获取远程端使用的端口
22         InetAddress inetAdd = s.getInetAddress();//获取套接字绑定的远程的IP
23         String inetName = inetAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名
24         String inetAddress = inetAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。
25         System.out.println("远程端口为:"+port);
26         System.out.println("远程IP地址的完全限定域名"+inetName);
27         System.out.println("远程IP的字符串为"+inetAddress);
28     }
29 }

 

客服端代码:

 1 package socket;
 2 
 3 import java.net.InetAddress;
 4 import java.net.Socket;
 5 
 6 public class Client {
 7     public static void main(String[] args) throws Exception {
 8         //连接的主机名为"localhost",连接到的主机8080端口。
 9         Socket s = new Socket("192.168.1.103",8080);
10         int localPort = s.getLocalPort();//获取本地端口
11         InetAddress localAdd = s.getLocalAddress();//获取套接字绑定的本地地址IP
12         String hostName = localAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名
13         String hostAddress = localAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。
14         System.out.println("本地端口为:"+localPort);
15         System.out.println("本地IP地址的完全限定域名:"+hostName);
16         System.out.println("本地IP的字符串为:"+hostAddress);
17         System.out.println("*************分割符*****************");
18         int port = s.getPort();//获取远程端使用的端口
19         InetAddress inetAdd = s.getInetAddress();//获取套接字绑定的远程的IP
20         String inetName = inetAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名
21         String inetAddress = inetAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。
22         System.out.println("远程端口为:"+port);
23         System.out.println("远程IP地址的完全限定域名"+inetName);
24         System.out.println("远程IP的字符串为"+inetAddress);
25     }
26 }

注意:要先开服务器,再开客户端。可以用浏览器代替客户端,因为http协议是基于tcp/ip协议的。

 3.获取网络的输入和输出流

 服务器源码:

 1 package socket;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStream;
 5 import java.io.InputStreamReader;
 6 import java.io.OutputStream;
 7 import java.io.OutputStreamWriter;
 8 import java.io.PrintWriter;
 9 import java.net.InetAddress;
10 import java.net.ServerSocket;
11 import java.net.Socket;
12 
13 public class Server {
14     public static void main(String[] args) throws Exception {
15         //创建serverSocket,并申请8080端口
16         ServerSocket ss = new ServerSocket(8080);
17         //阻塞方法,直到某个Socket连接。连接成功,产生Socket实例。
18         Socket s = ss.accept();
19         System.out.println("有客户端进入:");
20         int localPort = s.getLocalPort();//获取本地端口
21         InetAddress localAdd = s.getLocalAddress();//获取套接字绑定的本地地址IP
22         String hostName = localAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名
23         String hostAddress = localAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。
24         System.out.println("本地端口为:"+localPort);
25         System.out.println("本地IP地址的完全限定域名:"+hostName);
26         System.out.println("本地IP的字符串为:"+hostAddress);
27         System.out.println("*************分割符*****************");
28         int port = s.getPort();//获取远程端使用的端口
29         InetAddress inetAdd = s.getInetAddress();//获取套接字绑定的远程的IP
30         String inetName = inetAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名
31         String inetAddress = inetAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。
32         System.out.println("远程端口为:"+port);
33         System.out.println("远程IP地址的完全限定域名"+inetName);
34         System.out.println("远程IP的字符串为"+inetAddress);
35         InputStream is = s.getInputStream();//获取字节输入流
36         OutputStream os = s.getOutputStream();//获取字节输出流
37         BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"));//将字节流按照charset解析为字符,然后从字符流中读取文本
38         PrintWriter writer = new PrintWriter(new OutputStreamWriter(os,"utf-8"));//将文本行转换为字符,按照charset解析为字符流
39         writer.println("你好,客户端!");//向客服端发送消息
40         writer.flush();//刷新该流的缓冲
41         String str =reader.readLine();//读取客服端发送的消息
42         System.out.println("客户端说:"+str);
43         s.close();//关闭socket,释放系统资源
44     }
45 }

客户端源码:

 1 package socket;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStream;
 5 import java.io.InputStreamReader;
 6 import java.io.OutputStream;
 7 import java.io.OutputStreamWriter;
 8 import java.io.PrintWriter;
 9 import java.net.InetAddress;
10 import java.net.Socket;
11 
12 public class Client {
13     public static void main(String[] args) throws Exception {
14         //连接的主机名为"localhost",连接到的主机8080端口。
15         Socket s = new Socket("192.168.1.103",8080);
16         int localPort = s.getLocalPort();//获取本地端口
17         InetAddress localAdd = s.getLocalAddress();//获取套接字绑定的本地地址IP
18         String hostName = localAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名
19         String hostAddress = localAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。
20         System.out.println("本地端口为:"+localPort);
21         System.out.println("本地IP地址的完全限定域名:"+hostName);
22         System.out.println("本地IP的字符串为:"+hostAddress);
23         System.out.println("*************分割符*****************");
24         int port = s.getPort();//获取远程端使用的端口
25         InetAddress inetAdd = s.getInetAddress();//获取套接字绑定的远程的IP
26         String inetName = inetAdd.getCanonicalHostName();//获取此 IP 地址的完全限定域名
27         String inetAddress = inetAdd.getHostAddress();//返回 IP 地址字符串(以文本表现形式)。
28         System.out.println("远程端口为:"+port);
29         System.out.println("远程IP地址的完全限定域名"+inetName);
30         System.out.println("远程IP的字符串为"+inetAddress);
31         InputStream is = s.getInputStream();//获取字节输入流
32         OutputStream os = s.getOutputStream();//获取字节输出流
33         BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"));//将字节流按照charset解析为字符,然后从字符流中读取文本
34         PrintWriter writer = new PrintWriter(new OutputStreamWriter(os,"utf-8"));//将文本行转换为字符,按照charset解析为字符流
35         String str = reader.readLine();//接受服务器发送的信息
36         System.out.println("服务器说:"+str);
37         writer.println("服务器,你好!");//向服务器发送信息
38         writer.flush();//刷新该流的缓冲
39         s.close();//关闭socket,释放系统资源
40     }
41 }

 

 

 

 

 

转载于:https://www.cnblogs.com/miyin/p/3999519.html

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

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

相关文章

Taro+react开发(35) 实现拖动

<View><ScrollViewclassName"scrollview"scrollYscrollWithAnimationscrollTop{scrollTop}style{scrollStyle}lowerThreshold{Threshold}upperThreshold{Threshold}onScrollToUpper{this.onScrollToUpper.bind(this)} // 使用箭头函数的时候 可以这样写 onS…

CSS之左定宽度右自适应宽度并且等高布局

一、两列布局&#xff1a;左边固定宽度&#xff0c;右边自适应宽度 方法1&#xff1a;浮动布局 采用的是左边浮动&#xff0c;右边加上一个margin-left值&#xff0c;让他实现左边固定&#xff0c;右边自适应的布局效果 HTML: CSS: 上面这种实现方法最关键之处就是自适应宽度…

Windows Server 2003 R2与SP2 的区别

关于 R2&#xff0c;很多人分不清楚 R2 与 SP2 的关系&#xff0c;总是有人提出“R2 与 SP2 有什么区别”、“我应该将 Server 2003 升级到 R2 还是 SP2”之类的问题。其实 R2 与 SP2 两者并不冲突…… Windows Server 2003 R2 是微软为了扩展 Windows Server 2003 系统的功能而…

Linux scp 免密码 传输文件

SCP的使用 背景介绍 最近项目是集群化部署&#xff08;由 node1&#xff0c;node2&#xff0c;node3 三台 CentOS 7.4 的虚拟机构成&#xff09;。 但是&#xff0c;涉及到跨机器同步文件的问题&#xff0c;想通过写shell文件实现&#xff0c;用 crontab 设置定时任务&#…

ActiveX控件打包成Cab置于网页中自动下载安装

From: http://www.iteye.com/topic/110834 makeCAB.rar (188.5 KB) [背景] 做过ActiveX控件的朋友都知道&#xff0c;要想把自己做的ActiveX控件功能放在自己的网页上使用&#xff0c;那么用户在客户端就必须进行本地的注册&#xff0c;也就是说用户得首先要把该ActiveX控件(te…

我的博客我做主

今天刚刚注册了我的博客&#xff0c;本人将在这里叙写关于编程的方方面面新的知识点。首先声明&#xff0c;本人的编程还是个刚刚入门&#xff0c;所以现在只是向老前辈们学习&#xff0c;如果有比较经典的知识点&#xff0c;我会把把学到的新的知识点留在自己的博客上&#xf…

CSS之创建等高列布局之一

高度相等列在Web页面设计中永远是一个网页设计师的需求。如果所有列都有相同的背景色&#xff0c;高度相等还是不相等都无关紧要&#xff0c;因为你只要在这些列的父元素中设置一个背景色就可以了。但是&#xff0c;如果一个或多个列需要单独设置自己的背景色&#xff0c;那么它…

转这10句话

第一句 如果我们之间有1000步的距离  你只要跨出第1步 我就会朝你的方向走其余的999步 第二句 通常愿意留下来跟你争吵的人  才是真正爱你的人 第三句 付出真心 才会得到真心  却也可能伤得彻底 保持距离 就能保护自己  却也注定永远寂寞 第四句 有时候 不…

一篇介绍VC开发OCX的文章,写得太棒了!!!

From: http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语&#xff1a;最近在弄ocx控件发布到asp.net网站上使用&#xff0c;就是用户在使用过程中&#xff0c;自动下载安装ocx控件。&…

Taro+react开发(37)箭头函数括号加个return

{getLearnList.map((item, index) > (<View><View key{index} className"img-title"><Text>xueyuan</Text><Image mode"widthFix" src{item.imgCoverPath} /></View></View>))}

使用webpack打包后的vue项目如何运行(express)

我们知道使用webpack打包vue项目后会生成一个dist文件夹&#xff0c;dist文件夹下有html文件和其他css、js以及图片等&#xff0c;那么打包后的文件该如何正确运行呢&#xff1f; 倘若直接打开html文件&#xff0c;会报如下错误&#xff1a; 那么该如何运行呢&#xff1f;其实…

数据链路层与交换机

1. 数据链路层的功能是什么&#xff1f;负责网络中相邻节点之间可靠的数据传输&#xff0c;并进行有效的流量和差错控制。具体地讲&#xff0c;以一次数据发送为例&#xff0c;数据链路层的作用包括数据链路的建立、维护与拆除、帧包装、帧传输、帧同步、帧的差错控制以及流量控…

编译vo-aacenc遇到的问题

sourceforge更新了vo-aacenc到0.1.3&#xff0c;就把自己的编码器也更新到最新。编译过程中无聊多测试了一下 发现一个小问题http://sourceforge.net/projects/opencore-amr/files/vo-aacenc/下载后解压 1 [gonglinux vo-aacenc-0.1.3]$ pwd 2 /home/gong/ff4android/vo-aacenc…

CSS之创建等高列布局之二

3. 给容器div使用单独的背景色&#xff08;流体布局&#xff09; 这种布局可以说是就是第二种布局方法&#xff0c;只是这里是一种多列的流体等高列的布局方法。前面也说过了&#xff0c;其实现原理就是给每一列添加相对应用的容器&#xff0c;并进行相互嵌套&#xff0c;并在…

Oracle中Number(p,s)的意义

From: http://www.chinabyte.com/biz/cbfwq/394/2650894.shtml number(p,s) p:1~38 s:-84~127 p>0&#xff0c;对s分2种情况分析&#xff1a; 1. s>0 精确到小数点右边s位&#xff0c;并四舍五入。然后检验有效数位是否<p&#xff1b;如果s>p&#xff0c;小数点…

Taro+react开发(38)注意请求接口的/

//获取课程课期 export const getLastOfflineLessonByCourseCode data > {return request.get(${vdp}/offlineLesson/getLastOfflineLessonByCourseCode,data); };

git 上传代码步骤

接下来 第一步&#xff1a;建立git仓库 cd到你的本地项目根目录下&#xff0c;执行git命令&#xff0c;此命令会在当前目录下创建一个.git文件夹。 git init 第二步&#xff1a;将项目的所有文件添加到仓库中 git add . 这个命令会把当前路径下的所有文件&#xff0c;添加…

CSS之创建等高列布局之三

4. 使用正padding和负margin对冲实现多列布局方法 这种方法很简单&#xff0c;就是在所有列中使用正的上、下padding和负的上、下margin&#xff0c;并在所有列外面加上一个容器&#xff0c;并设置overflow:hiden把溢出背景切掉。下面一起来看代码 HTML: CSS: 这里代码的关键…

一个 人 的 态度 决定 他 成功 的 高度

一个 人 的 态度 决定 他 成功 的 高度转载于:https://blog.51cto.com/sunwei/122390