网路通信之socket

网络通信的三要素:

1.  IP:              设备的标识

2.  端口号:     进程间共同的标识

3.  传输协议:

UDP协议:  面向无连接,数据被封装(在64k以内),不可靠(速度快)。   运用实例: 聊天

TCP协议  :   面向连接,建立双方数据通道,需要三次握手,可靠(速度慢)。运用实例: 打电话

简单的说:UDP以包形式发送数据,但是不可靠,可能会丢包。TCP以流形式发送数据,可靠,但是效率慢

Socket通信实际上就是网络通信,在通信双方两头都有socket,以包/流形式发送数据。

*简单聊天程序:该案例是PC端和服务器进行通信
 *发和收同时进行,需要用多线程线,一个线程控制发,一个线程控制收
public class  book16{
      public static void main(String[] args) throws SocketException  {
                        DatagramSocket  sendsocket=new DatagramSocket();
                        DatagramSocket  receivesocket=new DatagramSocket(1001);   //根据端口来接受
  
                        new Thread(new send(sendsocket)).start();
                        new Thread(new receive(receivesocket)).start();
      }
}
class send  implements Runnable{
       private DatagramSocket   ds;
       public send( DatagramSocket   ds){
             this.ds=ds;
       }
       public void run() {
            try{
                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
               String s=null;
               while((s=br.readLine())!=null) {
                     if(s.equals("886")){
                           break;
                      }
                     byte[] b=s.getBytes();
                    //将数据封装到包里,除了数据外,还有IP,端口号                  
                    DatagramPacket  dp=new DatagramPacket(b, b.length,InetAddress.getByName("123.12.2.12"),1001);
                    ds.send(dp);
             }
          }
          catch (Exception e){
               throw new RuntimeException("发送失败");
          }
  
      }
 
}
class receive  implements Runnable{  
         private DatagramSocket ds;
         public receive(DatagramSocket ds){
                this.ds=ds;
         }
        public void run()  {
            try  {
              while(true){
                 byte[] b=new byte[1024];
                 DatagramPacket dp=new DatagramPacket(b, b.length);
                 ds.receive(dp);  //阻塞式方法
                 int i=dp.getPort();
                 String s=dp.getAddress().getHostAddress();
                  System.out.println(i+"\n"+s);
               }
            } 
           catch (Exception e){
                throw new RuntimeException("接受失败");
           }
       }
 
}

TCP的案例: 发送图片到服务器

* 客户端并发传图片

public class  book16{
  public static void main(String[] args)  {
    try {

//数组含有一个参数即图片时,大小为1
       if (args.length!=1){
             System.out.println("选择一个jpg格式的图片");
             return ;
       }
       File  f=new File(args[0]);   //根据主函数传值来选定图片
       if(!(f.exists()&&f.isFile())){
              System.out.println("文件不存在");
               return ;
       }
       if(!f.getName().endsWith(".jpg")){
              System.out.println("文件格式不对");
              return ;
       }
       
      Socket s=new Socket("123.123.2.123",1001);
      FileInputStream  fs=new FileInputStream(f);
      OutputStream os=s.getOutputStream();
      byte[] b=new byte[1024];
      int i=0;
      while((i=fs.read(b))!=-1) {
         os.write(b);
      }
      s.shutdownOutput();
      InputStream is=s.getInputStream();
      byte[] B=new byte[1024];
      int I=is.read(B);
      System.out.println(new String(B,0,I));
      fs.close();
      s.close();
    }
    catch (Exception e)
    {
   // TODO: handle exception
    }
  
   }
}

//服务端同时接受多个客户端,利用线程封装
public class  book16{
   public static void main(String[] args)  {
        try  {
           ServerSocket ss=new ServerSocket(1001);
           while(true){
             Socket s=ss.accept();
              new Thread( new THREAD(s) ).start();
           }
       }
    catch (IOException e){
    }
   }
}

class THREAD implements Runnable{
     private Socket s;
     public THREAD(Socket s) {
         this.s=s;
     }
     public void run() {  
         String ip=s.getInetAddress().getHostAddress();
         int count=1;
         try  {  
             System.out.println(ip+"链接");
             InputStream is=s.getInputStream();
             File f=new File(ip+"("+count+")"+".jpg");
             while( f.exists() ){
                     f=new File(ip+(count++)+".jpg");
             }
             FileOutputStream fs=new FileOutputStream(f);
             byte[] b=new byte[1024];
             int i=0;
             while((i=is.read(b))!=-1){
                   fs.write(b,0,i);
             }
            OutputStream os=s.getOutputStream();
            os.write("上传成功".getBytes());
            is.close();
           s.close();
        }
  catch (Exception e)  {
  
  }
 }
 
}

时间: 2024-09-30 09:03:40

网路通信之socket的相关文章

Python 3标准库 第十一章 网路通信

网路通信11.1 ipaddress  : Internet 地址 ipaddress模块提供了处理IPv4和IPv6 11.1.2  网络 CMDB 11.2  socket:网络通信 11.2.1 寻址.协议簇和套接字类型11.2.1.1   在网络上查找主机11.2.1.4   IP地址表示 inet_aton()   inet_ntoa()------------------------------到过年的时间,就把整段视频录制完成,然后,开始第二遍的讲解,明年的中旬,这本书讲的很透彻,

网络编程:Http通信与Socket通信

http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note 网络编程:Http通信与Socket通信(移动互联核心) 知识点概述: 1.Socket通信:面向连接(TCP)和无连接的(UDP) 2.HttpURLConnection 接口:Get和Post方式 3.HttpClient接口:Get和Post方式 知识点详述: 1 Socket通信 Socket称为”套接字“,用于描述IP地址和端口,它是支

C#通信之Socket通信的简单例子

socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过”套接字”向网络发出请求或者应答网络请求. 这里构建一个简单的例子,客户端发消息,服务端接收,然后回执一条消息.大致能够了解如何使用Socket进行通信. 服务端监听,接收信息: 客户端连接,并发送信息: 使用Socket通信,程序一般会在幕后运行,然后再合适的时间提示信息.这很自然的就会涉及到多线程的问题.在这个例子中因为每个连接都要创建一 个线程,所以需要对线程进行管理.这里我使用了两个类:Conn

android 两个客户端间的通信(Socket通信)

客户端之间通信:    实际上两个客户端不能直接通信,要借助服务器来做为中转站,才能实现双方通信. 一个客户端发送数据到服务器,服务器将数据发送给(所有连接上服务器的)客户端,这样客户端之间实现了通信. 服务器的代码: public class PcService {            private static final int SERVICEPORT=10086;            private static ArrayList<Socket> mClientList=new

客户端和服务器端的通信(Socket编程)

Socket编程 此篇博文的来源 自己一直以为将网络编程这块的知识掌握的还可以了,今天突然有涉及客户端和服务器端的通信的这一块知识的应用,发现自己还不是那么的熟悉这一块,鼓捣了半天,因此就想通过此篇博文来记录一下,也希望能够给更对的朋友们一点帮助 废话不多说,直接上代码 客户端的代码如下 package org.wrh.socketserver; import java.io.FileInputStream; import java.io.InputStream; import java.io.

阻塞通信之Socket编程

Socket通信,主要是基于TCP协议的通信.本文从Socket通信(代码实现).多线程并发.以及TCP协议相关原理方面 介绍 阻塞Socket通信一些知识. 本文从服务器端的视角,以“Echo Server”程序为示例,描述服务器如何处理客户端的连接请求.Echo Server的功能就是把客户端发给服务器的数据原封不动地返回给客户端. 第一种方式是单线程处理方式:服务器的处理方法如下: 1 public void service(){ 2 while (true) { 3 Socket soc

http通信与socket通信的区别

Socket连接与HTTP连接 由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开.但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器.网关.防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态. 而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端

java通信之Socket通信基础

正处于网络环境下的两个程序,它们之间通过一个交互的连接来实现数据通信.每一个连接的通信端叫做一个Socket.一个完整的Socket通信程序应该包含以下几个步骤: ①创建Socket: ②打开连接到Socket的输入输出流: ④按照一定的协议对Socket进行读写操作: ④关闭Socket. Socket通信分两部分:服务器端和客户端.服务器端必须优先启动,然后等待socket连接,如果达成连接则开始执行输入输出操作,通过输入流获取客户端的请求信息,通过 输出流返回客户端信息.客户端则只需创建一

百度面试(进程通信、socket)

1.  进程间通信 进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET. 系统IPC的三种方式类同,都是使用了内核里的标识符来识别. 匿名管道( pipe ):匿名管道是一种半双工的通信方式,通常是在父子进程间使用. 命名管道 (named pipe) :命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源