一、理解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的服务端与客户端通信(1)的更多相关文章

  1. java的服务端与客户端通信(2)

    一.Socket连接与HTTP连接   1.1Socket套接字 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信 ...

  2. Netty 学习(二):服务端与客户端通信

    Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...

  3. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  4. Java TCP服务端向客户端发送图片

    /** * 1.创建TCP服务端,TCP客户端 * 2.服务端等待客户端连接,客户端连接后,服务端向客户端写入图片 * 3.客户端收到后进行文件保存 * @author Administrator * ...

  5. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

  6. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  7. java网络编程-单线程服务端与客户端通信

    该服务器一次只能处理一个客户端请求;p/** * 利用Socket进行简单服务端与客户端连接 * 这是服务端 */public class EchoServer { private ServerSoc ...

  8. 【转】C# client 与java netty 服务端的简单通信,客户端采用Unity

    http://blog.csdn.net/wilsonke/article/details/24721057 近日根据官方提供的通信例子自己写了一个关于Unity(C#)和后台通信的类,拿出来和大家分 ...

  9. 多线程服务端与客户端通信(IO是阻塞的)_02

    下面是多线程的;每次服务端接受请求,会创建一个线程专门处理这个请求: 虽然是多线程的,但还是阻塞,相当于单线程处理模式 public class TimeServer { public static ...

随机推荐

  1. IOS设计模式的六大设计原则之迪米特法则(LOD,Law Of Demeter)

    定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle).如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中的一个类需要调用 ...

  2. Thinkphp5 使用命令行模式(cli模式)

    Tp5的cli模式跟Tp3.2变化较大,有自己的一套方式,在这里做个搬运工,把Tp文档的东西搬运过来,方便大家. 原出处截图 创建自定义命令行 第一步,配置command.php文件,目录在appli ...

  3. mysql 数据库复制表 create table city1 like city;

    -- 只复制表结构 create table city1 like city; INSERT INTO test2 SELECT * FROM test; -- 上面的表必须存在 -- 复制整张表的数 ...

  4. jvisualvm远程调试

    远程服务器端 (1)设置jstatd.all.policy 文件 grant codebase "file:${java.home}/../lib/tools.jar" { per ...

  5. C++实现文件关联

    下面这段话是百度百科对文件关联的解释. 文件关联就是将一种类型的文件与一个可以打开它的程序建立起一种依存关系.举个例子来说,位图文件(BMP文件)在Windows中的默认关联程序是“画图”,如果将其默 ...

  6. (转)Unity3d游戏开场CG动画播放方式

    1.在一个plane上播放 1 2 3 4 5 6 7 8 9 10 11 12 using UnityEngine; using System.Collections; public class M ...

  7. hdu 4705(树形DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数.于是我们可以确定中间点B,在 ...

  8. [Docker]学习笔记--简单介绍

    学习docker已经有一段时间了,一直没有静下心来好好总结一下. 最近用docker搭了一整套Gitlab的持续集成环境.(会在下一篇中详细的讲解具体步骤,敬请期待) 感觉是时候写点东西和大家一起分享 ...

  9. 关于string的replace方法

    今天写代码遇见一个小问题,就是当string  a,b,c,d当腰删除b的时候如果replace(“a”,"");会造成,b,c,d   所以得replace("a&qu ...

  10. Martin Fowler’s Active Record design pattern.

    P of EAA: Active Record https://www.martinfowler.com/eaaCatalog/activeRecord.html Active Record An o ...