javasocketJAVA 问题,用socket编写一个客户端程序

javasocket  时间:2021-07-20  阅读:()

java,socket连接和http连接的区别?

这个是网上转的,相互学习,楼主可以看看。

Java之Socket与HTTP区别 我们都知道TCP/IP协议共分四层: ① 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。

它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

② 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。

在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(互联网控制报文协议),以及IGMP协议(组管理协议)。

③ 传输层,主要为两台主机上的应用程序提供端到端的通信。

在TCP/IP协议族中,有两个互不相同的传输协议: TCP(传输控制协议)和UDP(用户数据报协议)。

TCP为两台主机提供高可靠性的数据通信。

它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。

由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。

而另一方面, U D P则为应用层提供一种非常简单的服务。

它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。

任何必需的可靠性必须由应用层来提供。

这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。

④ 应用层,负责处理特定的应用程序细节。

几乎各种不同的TCP/IP实现都会提供下面这些通用的应用程序: 远程登录。

FTP 文件传输协议。

SMTP 简单邮件传送协议。

SNMP 简单网络管理协议。

我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。

WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。

<1>Socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。

而TCP和UDP协议属于传输层 。

而http是个应用层的协议,它实际上也建立在TCP协议之上(HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力)。

<2>Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。

Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口。

下面是一些的重要的概念,特在此做摘抄和总结。

一。

什么是TCP连接的三次握手 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开) 二。

利用Socket建立网络连接的步骤 建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1。

服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2。

客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。

为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3。

连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。

而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

三。

HTTP链接的特点 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。

从建立连接到关闭连接的过程称为“一次连接”。

四。

TCP和UDP的区别 1。

TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

2。

也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。

知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

用JAVA写一个SOCKET 接收TCP发来的消息

public class TalkServer{     public static void main(String args[]) {       try{         ServerSocket server=null;         try{           server=new ServerSocket(4700);         //创建一个ServerSocket在端口4700监听客户请求         }catch(Exception e) {           System.out.println("can not listen to:"+e);         //出错,打印出错信息         }         Socket socket=null;         try{           socket=ept();           //使用ept()阻塞等待客户请求,有客户           //请求到来则产生一个Socket对象,并继续执行         }catch(Exception e) {           System.out.println("Error."+e);           //出错,打印出错信息         }         String line;         BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));          //由Socket对象得到输入流,并构造相应的BufferedReader对象         PrintWriter os=newPrintWriter(socket.getOutputStream());          //由Socket对象得到输出流,并构造PrintWriter对象         BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));          //由系统标准输入设备构造BufferedReader对象         System.out.println("Client:"+is.readLine());         //在标准输出上打印从客户端读入的字符串         line=sin.readLine();         //从标准输入读入一字符串         while(!line.equals("bye")){         //如果该字符串为 "bye",则停止循环           os.println(line);           //向客户端输出该字符串           os.flush();           //刷新输出流,使Client马上收到该字符串           System.out.println("Server:"+line);           //在系统标准输出上打印读入的字符串           System.out.println("Client:"+is.readLine());           //从Client读入一字符串,并打印到标准输出上           line=sin.readLine();           //从系统标准输入读入一字符串         }  //继续循环         os.close(); //关闭Socket输出流         is.close(); //关闭Socket输入流         socket.close(); //关闭Socket         server.close(); //关闭ServerSocket       }catch(Exception e){         System.out.println("Error:"+e);         //出错,打印出错信息       }     }   }

java编程中,Socket通信是怎么实现的?

java编程对于Socket之间的通信过程如下: 服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。

Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。

下面来看一些服务端与客户端通信的例子: public?class?Server?{ ???public?static?void?main(String?args[])?throws?IOException?{ ??????//为了简单起见,所有的异常信息都往外抛 ??????int?port?=?8899; ??????//定义一个ServerSocket监听在端口8899上 ??????ServerSocket?server?=?new?ServerSocket(port); ??????//server尝试接收其他Socket的连接请求,server的ept方法是阻塞式的 ??????Socket?socket?=?ept(); ??????//跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。

??????Reader?reader?=?new?InputStreamReader(socket.getInputStream()); ??????char?chars[]?=?new?char[64]; ??????int?len; ??????StringBuilder?sb?=?new?StringBuilder(); ??????while?((len=reader.read(chars))?!=?-1)?{ ?????????sb.append(new?String(chars,?0,?len)); ??????} ??????System.out.println("from?client:?"?+?sb); ??????reader.close(); ??????socket.close(); ??????server.close(); ???} }客户端代码 Java代码??public?class?Client?{?? ???public?static?void?main(String?args[])?throws?Exception?{?? ??????//为了简单起见,所有的异常都直接往外抛?? ??????String?host?=?"127.0.0.1";??//要连接的服务端IP地址?? ??????int?port?=?8899;???//要连接的服务端对应的监听端口?? ??????//与服务端建立连接?? ??????Socket?client?=?new?Socket(host,?port);?? ??????//建立连接后就可以往服务端写数据了?? ??????Writer?writer?=?new?OutputStreamWriter(client.getOutputStream());?? ??????writer.write("Hello?Server.");?? ??????writer.flush();//写完后要记得flush?? ??????writer.close();?? ??????client.close();?? ???}?? }

JAVA 问题,用socket编写一个客户端程序

给你一个我写的示例,用的是基于TCP的Socket技术,你锻炼一下,改一改,不会改再找我! 客户端: import .Socket; import java.io.InputStream; import java.io.OutputStream; import java.io.InputStreamReader; import java.io.BufferedReader; public class TcpClient { public static void main(String[] args) throws Exception { //创建客户端Socket服务,并且制定主机和duank Socket s = new Socket("192.168.1.104",10002);//连接固定的主机和端口 //为了发送数据,获取Socket中的输入输出流 OutputStream out = s.getOutputStream(); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String line = null; //读取服务器发过来的数据 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; while((line = br.readLine())!=null) { out.write(line.getBytes()); if("886".equals(line)) break; int len = in.read(buf); String content = new String(buf,0,len); System.out.println("Server:"+content); } s.close(); } } 服务器: /* * 需求分析: * 使用TCP协议,写服务器端。

做到服务器能收到客户端的信息,也能向客户端发送信息 * */ package JavaNetProgramming; import .ServerSocket; import .Socket; import java.io.InputStream; import java.io.OutputStream; import java.io.InputStreamReader; import java.io.BufferedReader; public class TcpServer { public static void main(String[] args) throws Exception { //建立服务器的Socket服务,并且监听一个端口 ServerSocket ss = new ServerSocket(10002); Socket s = ept(); InputStream is = s.getInputStream(); //从服务器端向客户端发送数据 OutputStream out = s.getOutputStream(); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String line = null; while(true) { //通过ept()方法获得客户端传过来的Socket对象 // System.out.println("getByNanme():"+Address()); System.out.print("getHostAddress():"+Address().getHostAddress()); //获取客户端发过来的数据,就要使用客户端对象的读取流来读取数据 byte[] buf = new byte[1024]; int len = is.read(buf);//把流中数据读到字节数组中 String content = new String(buf,0,len); System.out.println(" "+content); if("886".equals(content)) break; while((line = br.readLine())!=null) { out.write(line.getBytes()); break; } } s.close(); //循环内有判断语句,这句话才不出错 ss.close(); } }

美国G口/香港CTG/美国T级超防云/物理机/CDN大促销 1核 1G 24元/月

[六一云迎国庆]转盘活动实物礼品美国G口/香港CTG/美国T级超防云/物理机/CDN大促销六一云 成立于2018年,归属于西安六一网络科技有限公司,是一家国内正规持有IDC ISP CDN IRCS电信经营许可证书的老牌商家。大陆持证公司受大陆各部门监管不好用支持退款退现,再也不怕被割韭菜了!主要业务有:国内高防云,美国高防云,美国cera大带宽,香港CTG,香港沙田CN2,海外站群服务,物理机,...

hostkey荷兰/俄罗斯机房,GPU服务器

hostkey应该不用说大家都是比较熟悉的荷兰服务器品牌商家,主打荷兰、俄罗斯机房的独立服务器,包括常规服务器、AMD和Intel I9高频服务器、GPU服务器、高防服务器;当然,美国服务器也有,在纽约机房!官方网站:https://hostkey.com/gpu-dedicated-servers/比特币、信用卡、PayPal、支付宝、webmoney都可以付款!CPU类型AMD Ryzen9 ...

Hostodo(年付12美元),美西斯波坎机房Linux VPS主机66折

Hostodo 商家是比较小众的国外VPS主机商,这不看到商家有推送促销优惠在美国西岸的斯波坎机房还有少部分库存准备通过低价格促销,年付低至12美元Linux VPS主机,且如果是1GB内存方案的可以享受六六折优惠,均是采用KVM架构,且可以支付宝付款。第一、商家优惠码优惠码:spokanessd 1GB+内存方案才可以用到优惠码,其他都是固定的优惠低至年12美元。第二、商家促销这里,我们可以看到...

javasocket为你推荐
达内学院达内IT培训集团怎么样?软件开发的周期软件生命周期为什么将软件开发过程划分几个阶段?windows7正版验证怎样验证windows7是不是正版?iphone12或支持北斗导航ip12参数百度创业史简论《创业史》的思想内容.艺术手法windows7系统要求win7系统要求腾讯windows10升级助手win10升级助手登录失败怎么办 win10升级助手不能登录解决办法oa系统包含哪些模块求问OA办公系统的组成模块能分为哪三个类别?oa系统包含哪些模块oa软件一般都有哪些功能模块?计算机编程基础计算机编程需要什么基础?
ip反查域名 hawkhost 香港机房 商家促销 网盘申请 四川电信商城 海外空间 河南移动梦网 免费个人网页 数据湾 葫芦机 新疆服务器 脚本大全 windowsserver2008 restart ipower nic 回程 装修瓦工招聘 云主机 更多