A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯超 高级黑马   /  2013-9-4 00:54  /  1328 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 冯超 于 2013-9-5 23:08 编辑

                                                                               java网络编程
两台电脑能进行通信,为什么能了?
        1.通过ip地址找到对方主机;
        2.通过端口(port)找到对方使用的应用程序;
        4.应用程序一间通过协议如:TCP/IP
端口一般是0~~65535;但是0~~1024一般被系统端口所占有。
socket通信在传输层。

一:重点类InetAddress一般是查找Ip的类
        例如:InetAddress.getLocalHost()获取主机名和Ip地址.

关于传送协议的介绍:
     java中的网络传输方式分为UDP与TCP,他们各自的特点如下:
UDP:
    <1>讲数据源和目的源封装在数据包中,不需要连接。
    <2>每个数据限制在64K内
    <3>不需要连接,速度快。
    用于:聊天,视频会议等。
TCP:
    <1>需要连接
    <2>可以进行大数据传输
    <3>很安全。
缺点:UDP容易造成数据丢失,TCP传输的很慢。

二:重点类DatagramSocket与DatagramPacket类。关于UDP之间的socket通信
例如:DatagramSocket关于接受与发送数据。DatagramPacket关于数据打包及对于数据的获取。
     以下为实例代码:
发送端:
  1. package udp;

  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;


  6. public class Udpsend {
  7.         public static void main(String[] args) {
  8.                 //1.建立DatagramSocket通信
  9.                 try {
  10.                         //1.建立DatagramSocket通信
  11.                         DatagramSocket ds = new DatagramSocket();
  12.                         //2.提供数据
  13.                         byte[] buf = "feng chao  hello !".getBytes();
  14.                         //3.发送数据(数据,地址,端口号)
  15.                         DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(),
  16.                                         5512);
  17.                         ds.send(dp);
  18.                         //4.关闭资源
  19.                         ds.close();
  20.                 } catch (IOException e) {
  21.                         // TODO Auto-generated catch block
  22.                         e.printStackTrace();
  23.                 }
  24.         }
  25. }
复制代码
接收端:
  1. package udp;

  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;

  5. public class Udpreceive {
  6.         public static void main(String[] args) throws IOException {
  7.                 //1定义UDP socket服务
  8.                 DatagramSocket ds = new DatagramSocket(5512);
  9.                 //定义一个数据进行存储
  10.                 byte[] buf = new byte[1024];
  11.                 DatagramPacket dp = new DatagramPacket(buf, buf.length);
  12.                 //socket接受
  13.                 ds.receive(dp);
  14.                 //关闭资源
  15.                 //获取数据
  16.                 String ip = dp.getAddress().getHostAddress();
  17.                 String data = new String(dp.getData(), 0, dp.getLength());
  18.                 int port = dp.getPort();
  19.                
  20.                 System.out.println("ip :" + ip);
  21.                 System.out.println("data :" + data);
  22.                 System.out.println("port :" + port);
  23.                 ds.close();
  24.                
  25.         }
  26. }
复制代码
UDP之间的socket通信 需要对数据进行打包在发送
二:重点类ServerSocket与Socket类。关于TCP之间的socket通信 例如:ServerSocket 可以接受Socket他是服务端。Socket关于获取OutputStream和InputStream。
实例代码:
客户端:
  1. package tcp;

  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import java.net.InetAddress;
  5. import java.net.Socket;
  6. import java.net.UnknownHostException;

  7. public class TcpClient {

  8.         /**
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12.                 try {
  13.                         Socket socket = new Socket(InetAddress.getByName("KMNFCDZKTTHPEI8"), 1000);
  14.                        
  15.                         OutputStream out = socket.getOutputStream();
  16.                         String data = "hello wa ka yi";
  17.                         out.write(data.getBytes());
  18.                        
  19.                         socket.close();
  20.                 } catch (UnknownHostException e) {
  21.                         // TODO Auto-generated catch block
  22.                         e.printStackTrace();
  23.                 } catch (IOException e) {
  24.                         // TODO Auto-generated catch block
  25.                         e.printStackTrace();
  26.                 }
  27.         }

  28. }
复制代码
服务端:
  1. package tcp;

  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;

  7. public class TcpServe {

  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 //1创建服务端
  11.                 try {
  12.                         //1创建服务端
  13.                         ServerSocket server = new ServerSocket(1000);
  14.                         //2接受客户端的服务
  15.                         Socket socket = server.accept();
  16.                         InputStream in = socket.getInputStream();
  17.                        
  18.                         //得到数据
  19.                         String ip = socket.getInetAddress().getHostAddress();
  20.                         byte[] b= new byte[1024];
  21.                         int n = in.read(b);
  22.                         String data = new String(b, 0, n);  //疑问如何解决byte数组中没有数据的问题
  23.                         System.out.println(ip + ":" + data);
  24.                        
  25.                         socket.close();
  26.                         server.close();
  27.                 } catch (IOException e) {
  28.                
  29.                         e.printStackTrace();
  30.                 }
  31.         }

  32. }
复制代码
TCP之间的socket通信 是通过i/O流之间进行通信的。

tcp_ip.jpg (26.93 KB, 下载次数: 5)

tcp_ip.jpg

2 个回复

倒序浏览
支持分享,希望楼主继续补全内容。
还有帖子分类,请改成资源分享。
回复 使用道具 举报
就这些啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马