java的服务端与客户端通信(1)
2016-03-24 20:43
417 查看
一、理解socket
1.1什么是socket?
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。
1.2重要的socket
java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法:1.accept方法
用于产生"阻塞",直到接收到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
2.getInputStream方法
连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
3.getOutputStream方法
连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
1.3Socket通信原理
服务器:使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端:使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的动态的分配一个1024以上的端口。
ServerSocket类
ServerSocket myListener = new ServerSocket(600);
提供监听服务的端口是600,不同服务之间通过端口来区别。为了随时监听可能的Client端的请求,执行如下语句:
Socket linkSockt = myListener.accept();这个方法执行将使得Server端处于等待状态,直到接收一个来自Client端的请求,并返回一个与Client通信的Socket对象。
Server端与Client端连接后,就实现了相互读写数据,结束通信执行:
myListener.close();
Socket类
Client需从Server获取服务时,应创建一个Socket对象:
Socket mySocket = new Socket(host,port);
连通后,利用Socket类方法getOutputStream()获取(write)输出流,和getInputStream()获取(read)输入流。结束通信同样是
mySocket.close();
ServerSocket一般仅用于设置端口号和监听,真正进行通信的是Server端的Socket与Client端的Socket,在ServerSocket进行accept后,就将主动权转让给Server端的Socket。
二、socket编程范例及运行过程!
流程图如下:客户端代码:
1 import java.net.Socket; 2 import java.io.InputStream; 3 import java.io.OutputStream; 4 import java.io.PrintWriter; 5 import java.io.BufferedReader; 6 import java.io.InputStreamReader; 7 import java.io.IOException; 8 import java.net.UnknownHostException; 9 10 public class ClientText { 11 12 public static final String ip="127.0.32.42"; 13 public static int port=7890; 14 private Socket client_s; 15 16 public ClientText(){ 17 try{ 18 client_s=new Socket(ip,port); 19 }catch(UnknownHostException e){ 20 e.printStackTrace(); 21 }catch(IOException c){ 22 c.printStackTrace(); 23 } 24 } 25 26 public void setConnection() throws IOException{ 27 InputStream is; 28 OutputStream os; 29 try{ 30 is=client_s.getInputStream(); 31 os=client_s.getOutputStream(); 32 BufferedReader sys_br=new BufferedReader(new InputStreamReader(System.in)); 33 BufferedReader client_br=new BufferedReader(new InputStreamReader(is)); 34 PrintWriter client_pw=new PrintWriter(os,true); 35 String warnStr=null; 36 if((warnStr=client_br.readLine())!=null){ 37 System.out.println(warnStr); 38 } 39 while((warnStr=sys_br.readLine())!=null){ 40 client_pw.println(warnStr); 41 break; 42 } 43 }catch(IOException e){ 44 e.printStackTrace(); 45 } 46 } 47 48 public static void main(String[] args) { 49 // TODO 自动生成的方法存根 50 ClientText myclient=new ClientText(); 51 try { 52 myclient.setConnection(); 53 } catch (IOException e) { 54 // TODO 自动生成的 catch 块 55 e.printStackTrace(); 56 } 57 } 58 59 }
服务端代码:
1 import java.io.IOException; 2 import java.net.ServerSocket; 3 import java.net.Socket; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 import java.io.InputStreamReader; 7 import java.io.PrintWriter; 8 import java.io.BufferedReader; 9 10 public class ServerText{ 11 12 private ServerSocket ss; 13 public static final int port=7890; 14 15 public ServerText(){ 16 try{ 17 ss=new ServerSocket(port); 18 }catch(IOException e){ 19 e.printStackTrace(); 20 } 21 } 22 23 public void setConnection()throws IOException{ 24 Socket server_s; 25 OutputStream os; 26 InputStream is; 27 try{ 28 //服务器程序陷入阻塞状态,随时接受客户端的链接 29 server_s=ss.accept(); 30 //接收并连接之后 31 os=server_s.getOutputStream(); 32 is=server_s.getInputStream(); 33 //给客户端发送数据 34 PrintWriter server_pw=new PrintWriter(os,true); 35 //接收客户端的数据 36 BufferedReader server_br=new BufferedReader(new InputStreamReader(is)); 37 String msg=null; 38 server_pw.println("连接成功,请输入一些数据传递到服务端"); 39 if((msg=server_br.readLine())!=null){ 40 System.out.println("客户端传递过来的数据为:"+msg); 41 server_pw.println("数据传输成功"); 42 }else{ 43 server_pw.println("数据传输失败,出现错误"); 44 } 45 }catch(IOException e){ 46 e.printStackTrace(); 47 } 48 } 49 50 public static void main(String args[]) throws IOException{ 51 ServerText server_text=new ServerText(); 52 server_text.setConnection(); 53 54 } 55 }
运行结果:
客户端:
服务端:
以上就是简单的socket的通信过程。
相关文章推荐
- Java问题总结之32-内存释放
- 非IDE方式手动配置struts2环境之hello_world
- 学习JavaEE的每一天2016.3.24
- 堆排序
- 堆排序
- Struts2+Spring+Hibernat整合
- Java String不可变类总结
- rxjava 和reftofit结合的两个文章
- java-泛型
- 我理解的--java工厂模式
- JAVAEE学习笔记
- Caused by: java.util.ConcurrentModificationException
- Java_chapter06_一维数组
- java毕向东听课笔记1(交换两变量的值)
- JAVA环境配置
- 4000 java包装类及其拆箱装箱
- Java单例模式的实现
- Java问题总结之31-成员变量声明
- JavaEEMybatis
- 【Java】线程同步