文档章节

网路通信之socket

新根
 新根
发布于 2015/09/20 16:46
字数 682
阅读 45
收藏 2

 

网络通信的三要素:

    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)  {
  
  }
 }
 
}

 

 

© 著作权归作者所有

新根
粉丝 5
博文 28
码字总数 9431
作品 0
深圳
程序员
私信 提问
TCP/UDP协议与Socket

> Socket的TCP UDP通信,TCP、UDP网路协议; TCP使用的是流的方式发送,UDP是以包的形式发送。 1.构建tcp客户端的关键类: Socket; PrintWriter;InputStream;DataInputStream; Socket socke...

desaco
02/21
0
0
聊天程序(基于Socket、Thread)

聊天程序简述 1、目的:主要是为了阐述Socket,以及应用多线程,本文侧重Socket相关网路编程的阐述。如果您对多线程不了解,大家可以看下我的上一篇博文浅解多线程 。 2、功能:此聊天程序功能...

postdep
2014/08/24
0
0
请教,想用C++写一个通信库,用在android的游戏上通过unity3d调用,该怎么做呢?

我还是新手,JAVA、android、网路编程都没接触过。。。 老大给我个任务,让我把现有的jar的通讯库改成用C++写的,提供API给现在的unity3d游戏通信用。 我先大概了解了一些基础知识。现在好像...

哦哈喇
2013/07/26
2.3K
1
网络应用的Socket API编程的基本调用流程

哈喽!我是善水,本文章来自于本人在哈工大计算机网路之网尽其用系列课程学习之后的理解所写: 在计算机OSI七层协议的顶层-应用层的网络应用中,Socket套接字编程使我们必须使用的技术,现在...

sinat_38321889
2017/12/09
0
0
Linux网络之socket编程 (1)

在谈到socket编程之前,首先我们要知道一点预备知识。 预备知识: 1、网路字节序全部采用大端字节序。 关于字节序的详解,戳链接 查看,这里不做解释。 2、在编程之前,我们有必要了解,什么...

暮回_梓
2017/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springmvc的return “success”源码解读

qqqq

architect刘源源
今天
4
0
Java程序员五面阿里分享 逆袭成功 太不容易了!

前言 拿到阿里实习offer,经历了5次面试,其中4轮技术面,1轮HR面试。在这里分享一下自己的面试经验和学习心得。希望能够帮助更多的小伙伴。 我本科毕业于中南大学信管专业,真正开始学习Jav...

别打我会飞
昨天
4
0
Android Camera模块解析之视频录制

《Android Camera架构》 《Android Camera进程间通信类总结》 《Android Camera模块解析之拍照》 《Android Camera模块解析之视频录制》 《Android Camera原理之CameraDeviceCallbacks回调模...

天王盖地虎626
昨天
2
0
手把手教你使用issue作为博客评论系统

自从上周在阮一峰的 每周分享第 60 期 看到了可以将 GitHub 的 issue 当作评论系统,插入第三方网页的 JS 库——utterances。我就对此“魂牵梦绕”。个人博客使用的是VuePress。 TLDR (不多废...

jump--jump
昨天
6
0
商业合作模式有几种

公司合作首先要看公司的发展、定位已经公司双方的实力,前期沟通,了解很重要,切不可盲目。一般公司之间合作有以下: 一、六种合作模式 1、资源互换:资源互换是一种双方商定在一段时间内彼此...

吴伟祥
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部