51CTO下载-Java Socket编程 最简单CS程序示例
- 格式:pdf
- 大小:232.08 KB
- 文档页数:6
Java Socket CS示例程序1背景介绍Java是随着网络的盛行而逐渐被人认可的,可想而知其网络编程的能力有多强大。
本文介绍一个Java Socket CS模型的一个简单示例,简单但不低端。
程序是在本地模拟CS模型,即服务端和客户端两个程序可以相互通信。
实现形式是两个程序分别定义好要说的话,然后按顺序交互在终端打印。
2Socket通信过程真实中的通信类似QQ是两个或多个程序在不同的电脑上,通过互联网交换信息。
程序间是通过通过(IP地址:端口号)的形式来实现互相访问的。
那么两个程序在本地又是怎么能互相连接的,又是如何交换信息的?仔细看上图,首先建立监听程序SeverSocket()来作为服务端,服务端调用accept()方法不断在所设端口监听是否有要求连接的请求。
此时建立客户端程序,该客户端是以发送Socket()套接字的方式建立的。
客户端往所设端口去请求服务,如果遇到accept(),则双方达成连接共识于是建立连接。
连上之后,双方是通过发送socket套接字来实现交流的。
套接字封装了网络通信底层包括协议,端口地址等信息。
客户端要发送信息,其次用建立输出流,输出流另外一段是socket套接字,只要往该流里面println()数据,则会自动封装到该套接字里面。
发送时,将socket 套接字发送给服务端。
服务端收到套接字,从套接字找到携带的信息放入输入流,然后输入流端通过readLine()就可以直接将信息打印在屏幕上了。
此时服务端要往客户端发送信息,过程一样,将信息写入输出流,然后封装成套接字,对方接受套接字,将信息放到输出流,然后就能输出该信息了。
套接字起到了封转底层的作用,程序互联变得很容易,而用输入输出流连接中介转接套接字,一是套接字无法直接输出内容,二是通过流的形式输入输出信息,是Java推荐的,因为其本身包含大量方法,用起来会非常得心应手。
最后,要关闭连接要释放端口等资源。
3示例过程介绍本段通过具体例子来加深读者对Socket通信过程的印象。
1)建立服务器ServerSocket()2)服务器调用accept()方法来监听9999端口。
3)建立客户端Socket,往9999端口发送套接字,请求连接。
4)服务器accept()方法收到一个套接字,说是某某程序想要跟服务器建立连接。
accept()接受该请求,于是俩程序建立连接。
5)现在客户机想给服务器发送一个字符串“你好,我是客户机”。
首先客户机将该字符串用Println()封装到输出流PrintWriter里面,PrintWriter将该信息再封装到套接字socket里面。
于是再向服务器端口发送套接字。
6)服务器端口又接到套接字,将该套接字放到InputStreamReader里面解封装,再用readLine()方法读取里面的字符串,print()到屏幕上面,打印出“你好,我是客户机”。
7)服务器想回送客户机一个信息,如“我是服务器,你发来的信息已收到”。
同样是将该字符串封装到输出流PrintWriter里面,该输出流再封装成套接字socket,发送给客户端。
8)客户端同样是接收该套接字,解封装到输入流InputStreamReader,然后再从该流里面readLine()取出信息,print()打印到屏幕,出来“我是服务器,你发来的信息已收到”的信息。
如此可实现反复的半双工通信。
9)双方用close()方法释放连接。
4完整代码服务器端程序(tempServer)5package com.futeng.temp;6/*7*内容:Java Socket编程示例(@futeng)8*制作:@futeng#1.0/2012/07319*说明:10*/11import java.io.BufferedReader;12import java.io.InputStreamReader;13import java.io.PrintWriter;14import .*;1516public class tempServer{17/*18*服务端Server客户端Client19*20*服务器监听ServerSocekt()21*|22*阻塞,等待客户连接accept()<--------发送连接请求Socket()23*||24*||25*读取客户端所发送的数据readLine()<--------向服务端发送数据Println()26*||27*向客户端发送数据Println------------>读取服务端信息readLine()28*||29*关闭连接close()关闭连接close()30*31*/32public tempServer()33{34try35{//建立服务器端程序serversocket,并默认不断扫描8888端口。
36ServerSocket serversocket=new ServerSocket(8888);37System.out.println("Hi,我是服务器,正在监听8888端口...");3839//Java用Socket套接字封装了底层的协议端口等,换而言之,两个进程都是通过传递套接字来进行通信。
40//声明一个Socket类的套接字来存储来往信息41//accept()方法返回接收到的套接字,返回值类型为Socket类,刚好赋值给socket实例对象。
42Socket socket=serversocket.accept();4344//服务器端接受从客户端发送过来的数据。
套接字不能直接打开,需要用输入流的方式打开。
45//建立输入流InputStreamRead实例in来存储从客户端发送过来的套接字46InputStreamReader isr=new InputStreamReader(socket.getInputStream()); 47//用BufferRead类来封装下该输入流类isr实例。
封装的目的在于BufferRead类可以很容易的输出信息。
48BufferedReader in=new BufferedReader(isr);49//BufferRead类方法readLine()来接受数据并处理为String型50String info=in.readLine();51System.out.println("服务器:我收到来自客户端的信息为---->"+info);5253//服务器往客户机输出信息54PrintWriter out=new PrintWriter(socket.getOutputStream(),true);55out.println("我是服务器,这是我发给客户机的信息。
");5657}catch(Exception e)58{59 e.printStackTrace();60}61}6263public static void main(String[]args)64{65tempServer ts=new tempServer();66}6768}客户端程序(tempClient)69package com.futeng.temp;7071import .*;72import java.io.*;7374public class tempClient{75public tempClient()76{77try78{//建立客户端程序,Socket套接字有一套完整的传输机制。
79//建立一个Socket来请求连接服务器端,80//此处Socket寻找的是本机localhost中的8888端口。
81//如果一旦发现该端口被监听,则socket立即与之产生联系,于是就可以互相通信。
82Socket socket=new Socket("127.0.0.1",8888);8384//客户端往socket里面输出信息,服务器接收socket然后阅读里面信息。
socket起到的是封装作用。
85//socket通过输出流将数据写入86//因为不能直接往套接字里面写数据,所以需要建一个输出流,建PrintWriter类实例out,这个out是连接套接字的输出流的。
87//即往out里面写数据,就相当于写入了该套接字88PrintWriter out=new PrintWriter(socket.getOutputStream(),true);89out.println("我是客户端,我正往服务器输出数据...");9091//客户端接受服务器发送的信息92InputStreamReader isr=new InputStreamReader(socket.getInputStream()); 93BufferedReader in=new BufferedReader(isr);9495//接受信息从服务器96String info=in.readLine();97System.out.println("我是客户机,服务器给我发送的信息是:"+info);9899100101102}catch(Exception e)103{104 e.printStackTrace();105}106107}108109public static void main(String[]args)110{111tempClient tc=new tempClient();112}113}5运行方法在Eclipse中运行,新建一个项目,在src目录下新建两个文件class,分别命名为tempServer和tempClient,并且修改源代码包为你的包名。
即修改首行package com.futeng.temp;为你的包,如你的包名为com.abc.test则修改为package com.abc.test;。
先运行Server再运行tempClient,这是你就会看到如下输出。
运行服务器端运行客户机端停止程序后输出6结束语文章发布地址:/s/blog_a02a31ce010166oe.html更多内容请访问:FUTENG科技新浪博客问题与留言访问:FUTENG科技新浪微博欢迎访问与支持FUTENG官方网站的建设,你还可以下载本博客的安卓客户端。