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(); } }

数脉科技:六月优惠促销,免备案香港物理服务器,E3-1230v2处理器16G内存,350元/月

数脉科技六月优惠促销发布了!数脉科技对香港自营机房的香港服务器进行超低价促销,可选择30M、50M、100Mbps的优质bgp网络。更大带宽可在选购时选择同样享受优惠,目前仅提供HKBGP、阿里云产品,香港CN2、产品优惠码续费有效,仅限新购,每个客户可使用于一个订单。新客户可以立减400元,或者选择对应的机器用相应的优惠码,有需要的朋友可以尝试一下。点击进入:数脉科技官方网站地址数脉科技是一家成...

免费注册宝塔面板账户赠送价值3188礼包适合购买抵扣折扣

对于一般的用户来说,我们使用宝塔面板免费版本功能还是足够的,如果我们有需要付费插件和专业版的功能,且需要的插件比较多,实际上且长期使用的话,还是购买付费专业版或者企业版本划算一些。昨天也有在文章中分享年中促销活动。如今我们是否会发现,我们在安装宝塔面板后是必须强制我们登录账户的,否则一直有弹出登录界面,我们还是注册一个账户比较好。反正免费注册宝塔账户还有代金券赠送。 新注册宝塔账户送代金券我们注册...

青云互联:美国洛杉矶CN2弹性云限时八折,15元/月起,可选Windows/可自定义配置

青云互联怎么样?青云互联是一家成立于2020年6月的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,目前提供有美国免费主机、香港主机、香港服务器、美国云服务器,让您的网站高速、稳定运行。美国cn2弹性云主机限时8折起,可选1-20个IP,仅15元/月起,附8折优惠码使用!点击进入:青云互联官方网站地址青云互联优惠码:八折优惠码:ltY8sHMh (续费同价)青云互联活动方案:美国洛杉矶...

javasocket为你推荐
智能机刷机软件安卓手机在电脑上强制刷机用什么软件好?百度预测世界杯世界杯预测bt4破解教程请教BT4光盘版的教程bt4破解教程破解软件BT4色中色luntancoreldraw x6怎么抠图换背景iphone12或支持北斗导航苹果12几个版本windows7系统要求Windows7系统对电脑配置的要求,做视频的免费软件求有哪种视频制作软件是全免费的啊?魔兽世界密保卡WOW现在的密保卡怎么弄?Costco茅台被抢光Costco在中国大陆第一家店开业首日被挤爆,为什么人们都特别青睐洋货?
中文国际域名 万网域名管理 主机屋 hkbn 香港机房 l5639 wdcp 淘宝双十一2018 美国php空间 免空 架设服务器 免费全能主机 服务器是干什么的 国外免费asp空间 支付宝扫码领红包 厦门电信 联通网站 永久免费空间 杭州电信 免备案jsp空间 更多