原文出自:http://www.cnblogs.com/rocomp/p/4790340.html

Socket是网络驱动层提供给应用程序编程接口和一种机制。可以把Socket比喻成一个港口码头,应用程序只要把货物放到港口码头上,就算完成了货物的运送。对于接收方应用程序也要创建一个港口码头,只需等待货物到达码头后将货物取走。

InetAddress

         InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。 
         该类没有构造方法        
 
1 //获取本机的InetAddress实例
2 InetAddress address =InetAddress.getLocalHost();
3 address.getHostName();//获取计算机名
4 address.getHostAddress();//获取IP地址
5 byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分
6
7 //获取其他主机的InetAddress实例
8 InetAddress address2 =InetAddress.getByName("其他主机名");
9 InetAddress address3 =InetAddress.getByName("IP地址");
 
二、URL类
         1、URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址,协议名:资源名称       
  1.  
     1 //创建一个URL的实例
    2 URL baidu =new URL("http://www.baidu.com");
    3 URL url =new URL(baidu,"/index.html?username=tom#test");//?表示参数,#表示锚点
    4 url.getProtocol();//获取协议
    5 url.getHost();//获取主机
    6 url.getPort();//如果没有指定端口号,根据协议不同使用默认端口。此时getPort()方法的返回值为 -1
    7 url.getPath();//获取文件路径
    8 url.getFile();//文件名,包括文件路径+参数
    9 url.getRef();//相对路径,就是锚点,即#号后面的内容
    10 url.getQuery();//查询字符串,即参数
     
         2、使用URL读取网页内容
           通过URL对象的openStream()方法可以得到指定资源的输入流,通过流能够读取或访问网页上的资源      
  1.  
     1 //使用URL读取网页内容
    2 //创建一个URL实例
    3 URL url =new URL("http://www.baidu.com");
    4 InputStream is = url.openStream();//通过openStream方法获取资源的字节输入流
    5 InputStreamReader isr =newInputStreamReader(is,"UTF-8");//将字节输入流转换为字符输入流,如果不指定编码,中文可能会出现乱码
    6 BufferedReader br =newBufferedReader(isr);//为字符输入流添加缓冲,提高读取效率
    7 String data = br.readLine();//读取数据
    8 while(data!=null){
    9 System.out.println(data);//输出数据
    10 data = br.readerLine();
    11 }
    12 br.close();
    13 isr.colose();
    14 is.close();
     
三、TCP编程
         1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低
         2、Java中基于TCP协议实现网络通信的类
            客户端的Socket类
            服务器端的ServerSocket类
           
            3、Socket通信的步骤
                 ① 创建ServerSocket和Socket
                 ② 打开连接到Socket的输入/输出流
                 ③ 按照协议对Socket进行读/写操作
                 ④ 关闭输入输出流、关闭Socket
           4、服务器端:
                 ① 创建ServerSocket对象,绑定监听端口
                 ② 通过accept()方法监听客户端请求
                 ③ 连接建立后,通过输入流读取客户端发送的请求信息
                 ④ 通过输出流向客户端发送乡音信息
                 ⑤ 关闭相关资源
  1.  
     1 /**
    2 * 基于TCP协议的Socket通信,实现用户登录,服务端
    3 */
    4 //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
    5 ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某个端口
    6 //2、调用accept()方法开始监听,等待客户端的连接
    7 Socket socket = serverSocket.accept();
    8 //3、获取输入流,并读取客户端信息
    9 InputStream is = socket.getInputStream();
    10 InputStreamReader isr =newInputStreamReader(is);
    11 BufferedReader br =newBufferedReader(isr);
    12 String info =null;
    13 while((info=br.readLine())!=null){
    14 System.out.println("我是服务器,客户端说:"+info);
    15 }
    16 socket.shutdownInput();//关闭输入流
    17 //4、获取输出流,响应客户端的请求
    18 OutputStream os = socket.getOutputStream();
    19 PrintWriter pw = new PrintWriter(os);
    20 pw.write("欢迎您!");
    21 pw.flush();
    22
    23
    24 //5、关闭资源
    25 pw.close();
    26 os.close();
    27 br.close();
    28 isr.close();
    29 is.close();
    30 socket.close();
    31 serverSocket.close();
     

    5、客户端:

                 ① 创建Socket对象,指明需要连接的服务器的地址和端口号
                 ② 连接建立后,通过输出流想服务器端发送请求信息
                 ③ 通过输入流获取服务器响应的信息
                 ④ 关闭响应资源 
  1.  
     1 //客户端
    2 //1、创建客户端Socket,指定服务器地址和端口
    3 Socket socket =newSocket("localhost",10086);
    4 //2、获取输出流,向服务器端发送信息
    5 OutputStream os = socket.getOutputStream();//字节输出流
    6 PrintWriter pw =newPrintWriter(os);//将输出流包装成打印流
    7 pw.write("用户名:admin;密码:123");
    8 pw.flush();
    9 socket.shutdownOutput();
    10 //3、获取输入流,并读取服务器端的响应信息
    11 InputStream is = socket.getInputStream();
    12 BufferedReader br = new BufferedReader(new InputStreamReader(is));
    13 String info = null;
    14 while((info=br.readLine())!null){
    15 System.out.println("我是客户端,服务器说:"+info);
    16 }
    17
    18 //4、关闭资源
    19 br.close();
    20 is.close();
    21 pw.close();
    22 os.close();
    23 socket.close();
     

     

   6、应用多线程实现服务器与多客户端之间的通信

               ① 服务器端创建ServerSocket,循环调用accept()等待客户端连接
               ② 客户端创建一个socket并请求和服务器端连接
               ③ 服务器端接受苦读段请求,创建socket与该客户建立专线连接
               ④ 建立连接的两个socket在一个单独的线程上对话
               ⑤ 服务器端继续等待新的连接        
 
 1 //服务器线程处理
2 //和本线程相关的socket
3 Socket socket =null;
4 //
5 public serverThread(Socket socket){
6 this.socket = socket;
7 }
8
9 publicvoid run(){
10 //服务器处理代码
11 }
12
13 //============================================
14 //服务器代码
15 ServerSocket serverSocket =newServerSocket(10086);
16 Socket socket =null;
17 int count =0;//记录客户端的数量
18 while(true){
19 socket = serverScoket.accept();
20 ServerThread serverThread =newServerThread(socket);
21 serverThread.start();
22 count++;
23 System.out.println("客户端连接的数量:"+count);
24 }
 
四、UDP编程
       UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快
       进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去
       DatagramPacket类:表示数据报包
       DatagramSocket类:进行端到端通信的类
       1、服务器端实现步骤
           ① 创建DatagramSocket,指定端口号
           ② 创建DatagramPacket
           ③ 接受客户端发送的数据信息
           ④ 读取数据
  1.  
     1 //服务器端,实现基于UDP的用户登录
    2 //1、创建服务器端DatagramSocket,指定端口
    3 DatagramSocket socket =new datagramSocket(10010);
    4 //2、创建数据报,用于接受客户端发送的数据
    5 byte[] data =newbyte[1024];//
    6 DatagramPacket packet =newDatagramPacket(data,data.length);
    7 //3、接受客户端发送的数据
    8 socket.receive(packet);//此方法在接受数据报之前会一致阻塞
    9 //4、读取数据
    10 String info =newString(data,o,data.length);
    11 System.out.println("我是服务器,客户端告诉我"+info);
    12
    13
    14 //=========================================================
    15 //向客户端响应数据
    16 //1、定义客户端的地址、端口号、数据
    17 InetAddress address = packet.getAddress();
    18 int port = packet.getPort();
    19 byte[] data2 = "欢迎您!".geyBytes();
    20 //2、创建数据报,包含响应的数据信息
    21 DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port);
    22 //3、响应客户端
    23 socket.send(packet2);
    24 //4、关闭资源
    25 socket.close();
     

         

    2、客户端实现步骤

           ① 定义发送信息
           ② 创建DatagramPacket,包含将要发送的信息
           ③ 创建DatagramSocket
           ④ 发送数据
  1.  
     1 //客户端
    2 //1、定义服务器的地址、端口号、数据
    3 InetAddress address =InetAddress.getByName("localhost");
    4 int port =10010;
    5 byte[] data ="用户名:admin;密码:123".getBytes();
    6 //2、创建数据报,包含发送的数据信息
    7 DatagramPacket packet = newDatagramPacket(data,data,length,address,port);
    8 //3、创建DatagramSocket对象
    9 DatagramSocket socket =newDatagramSocket();
    10 //4、向服务器发送数据
    11 socket.send(packet);
    12
    13
    14 //接受服务器端响应数据
    15 //======================================
    16 //1、创建数据报,用于接受服务器端响应数据
    17 byte[] data2 = new byte[1024];
    18 DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
    19 //2、接受服务器响应的数据
    20 socket.receive(packet2);
    21 String raply = new String(data2,0,packet2.getLenth());
    22 System.out.println("我是客户端,服务器说:"+reply);
    23 //4、关闭资源
    24 socket.close();
     

     

五、注意问题:

     1、多线程的优先级问题:
            根据实际的经验,适当的降低优先级,否侧可能会有程序运行效率低的情况
     2、是否关闭输出流和输入流:
             对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭socket即可
     3、使用TCP通信传输对象,IO中序列化部分
     4、socket编程传递文件,IO流部分

(转)Java Socket编程的更多相关文章

  1. Java Socket编程题库

    一.    填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...

  2. Java Socket编程(转)

    Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...

  3. Java基础:三步学会Java Socket编程

    Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛        第一步 ...

  4. 如何为可扩展系统进行Java Socket编程

    从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket ...

  5. 多线程Java Socket编程示例

    package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...

  6. 转:Java Socket编程

    对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将 ...

  7. Java Socket编程基础篇

    原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...

  8. Java Socket编程详细解说

    Java Socket编程 JavaSocketServerSocket乱码超时 Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是So ...

  9. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  10. 20182332 实验四《Java Socket编程 》实验报告

    20182332 实验肆<数据结构与面向对象程序设计>实验报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 盛国榕 学号:20182332 实验教师:王志强 实验日 ...

随机推荐

  1. 201521123088《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  2. Java第十三周总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  3. 201521123022 《Java程序设计》 第十三周学习总结

    1. 本周学习总结 2. 书面作业 Q1. 网络基础 Q1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 前者IP ...

  4. 201521123027 <java程序设计>第十二周作业总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2.书面作业 将Student对象(属性:int id, String name,int age,double ...

  5. JDBC第四篇--【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的. 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接池 ...

  6. 03标准对象-01-Date和JSON

    0.写在前面的话 在JS世界中,一切都是对象,区别对象类型使用tyepof,返回一个字符串,如: typeof 123; // 'number' typeof NaN; // 'number' typ ...

  7. Java实现基本排序算法

    稳定排序算法性能比较 冒泡排序代码: /** * 冒泡排序 * * @param arr * @return */ public int[] bubbleSort(int[] arr) { int t ...

  8. [python学习笔记] python程序打包成exe文件

    安装 pyinstaller pip3 install pyinstaller 命令 pyinstaller -F -w -i ../ui/icon.ico --clean ../Login.py 参 ...

  9. oracle pl/sql 控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

  10. 转载 iOS拦截导航栏返回按钮事件的正确方式

    原文链接:http://www.jianshu.com/p/25fd027916fa 当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮 ...