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

PIGYun月付14.4元起,美国洛杉矶/韩国VPS七月6折

PIGYun是成立于2019年的国人商家,提供香港、韩国和美西CUVIP-9929等机房线路基于KVM架构的VPS主机,本月商家针对韩国首尔、美国洛杉矶CUVIP-AS29、GIA回程带防御等多条线路VPS提供6-8.5折优惠码,优惠后韩国首尔CN2混合BGP特惠型/美国洛杉矶GIA回程带10Gbps攻击防御VPS主机最低每月14.4元起。下面列出几款不同机房VPS主机配置信息,请留意不同优惠码。...

SoftShellWeb:台湾(台北)VPS年付49美元起,荷兰VPS年付24美元起

SoftShellWeb是一家2019年成立的国外主机商,商家在英格兰注册,提供的产品包括虚拟主机和VPS,其中VPS基于KVM架构,采用SSD硬盘,提供IPv4+IPv6,可选美国(圣何塞)、荷兰(阿姆斯特丹)和台湾(台北)等机房。商家近期推出台湾和荷兰年付特价VPS主机,其中台湾VPS最低年付49美元,荷兰VPS年付24美元起。台湾VPSCPU:1core内存:2GB硬盘:20GB SSD流量...

易探云:买香港/美国/国内云服务器送QQ音乐绿钻豪华版1年,价值180元

易探云产品限时秒杀&QQ音乐典藏活动正在进行中!购买易探云香港/美国云服务器送QQ音乐绿钻豪华版1年,价值180元,性价比超级高。目前,有四大核心福利产品推荐:福利一、香港云服务器1核1G2M,仅218元/年起(香港CN2线路,全球50ms以内);福利二、美国20G高防云服务器1核1G5M,仅336元/年起(美国BGP线路,自带20G防御);福利三、2G虚拟主机低至58.8元/年(更有免费...

javasocket为你推荐
防恶意点击防恶意点击的原理到底是什么?magento2MRP与MRP2的区别呼叫中心搭建呼叫中心有几种建设方式啊?那种最省钱?创业好项目论坛现在挣钱太难了、大家有什么好项目vs2005快捷键vs中的一个快捷键linux操作系统好吗linux好用不?99客服软件下载46级成绩查询忘记准考证怎么办handoff怎么用如何令Yosemite使用iPhone的通话功能和Handoff设置handoff怎么用iphone handoff怎么用魔兽世界密保卡魔兽世界密保卡绑定
域名网 域名信息查询 阿里云搜索 新秒杀 bluehost pw域名 韩国空间 博客主机 omnis 20g硬盘 gg广告 数字域名 宁波服务器 老左来了 双11秒杀 能外链的相册 吉林铁通 双线机房 raid10 环聊 更多