Socket 2 FLash

Socket可以理解为网络编程的接口,既然是网络传输,就至少有两端,一个Server,一个Client,当然这个划分也很模糊,有时候Server和Client也可以相互转化.总之Socket就是实现了数据在Server和Client间的互相流动.

目前至少有两种基于协议的Socket,TCP/IP Socket和 UDP Socket
1,UDP协议相对简单一些,直接把要发送的数据通过Socket API进行打包如package,并send即可
2,TCP Socket复杂一点,因为她要通过三次握手协议,只有确定另外一端已经连接上Socket,她才发送数据
   比如在Server端,建立一个ServerSocket,并且设置处于监听状态Listening,当Client端的Socket启动,并且试图
  connectServer的时候,Server才做出响应并发送数据流

当然你可能认为Socket很好理解,那么要你写一个完整的Socket又如何呢?实际上有很多的源码,已经写好了的
我也不太喜欢理论型的技术,而且也懒的总结,所以还是直接把源码列出来,有别人的,也有我自己的.当然代码是肯定经过我测试通过的

我自己在单机上测试的时候是直接启动一个MyEclipse,一个Eclipse,分别做为两端,查看端口的时候可以在命令行输入:netstat -a 来看是否打开端口或者端口是否被监听和占用

首先来UDP的(UDP的有些兼容性的问题,不过有时候不失为一种选择) 
服务器端:
import java.io.*;
import java.net.*;
public class Srv12 extends Thread
{
DatagramSocket ServerSocket;
public Srv12()
{  
  super("FortuneServer1");
  try
  {
   ServerSocket = new DatagramSocket(9528);
   System.out.println("FortuneServer up and running...");
  }
  catch (SocketException e)
  {
   System.err.println("Exception: couldn't create datagram socket");
   System.exit(1);
  }
}
public static void main(String[] args)
{
  Srv12 server = new Srv12();
  server.start();
}
public void run()
{
  if (ServerSocket == null)
   return;
  while (true)
  {
   try
   {
    InetAddress address;
    int port;
    DatagramPacket packet; 
byte[] data = new byte[128];
    String ss;
    packet = new DatagramPacket(data, data.length);    
    ServerSocket.receive(packet);
                   //如果1114端口没有请求到数据,就一直停留在这里等待数据接收
                   //如果接收到数据,则将数据包放在packet对象中,并在下面对其解析
    address = packet.getAddress();
    port = packet.getPort();
    
    ss=new String(data);
    System.out.println(ss);
    /*FileWriter fw = new FileWriter("Fortunes.txt");//创建新文件
             PrintWriter out = new PrintWriter(fw);    
             for(int i=0;i<data.length;i++){
        out.print(data[i]+"  ");
       }
    out.close();
             System.out.println("Data has been writen to destination!");*/
    
    //再次创建数据包,发送到接收的数据的端口
    packet = new DatagramPacket(data, data.length, address, port);
    ServerSocket.send(packet);
    System.out.println("Respond has been made!");
   }
   catch (Exception e)
   {
    System.err.println("Exception: " + e);
    e.printStackTrace();
   }
  }
}

 

客户端:

import java.net.*;
public class Client12
{
public static void main(String args[])
{
  Client12 client = new Client12();
  System.out.println(client.getMessage());
}
public String getMessage()
{
  String fortune;
  try {
   DatagramSocket socket;
   DatagramPacket packet;
   byte[] data = new byte[128];
  
   for(int i=0;i<data.length;i++){
    Integer integer=new Integer(i);
    data[i]=integer.byteValue();
   }
  
   socket = new DatagramSocket();
   //packet = new DatagramPacket(data, data.length,InetAddress.getByName("127.0.0.1"), 1114);
   packet = new DatagramPacket(data, data.length,InetAddress.getLocalHost(), 10000);
   System.out.println("AAAAA");
   socket.send(packet);
  
   packet = new DatagramPacket(data, data.length);
   socket.receive(packet);
   fortune = new String(packet.getData());
   socket.close();
  }
catch (UnknownHostException e) {
   System.err.println("Exception: host could not be found");
   return null;
  }
  catch (Exception e) {
   System.err.println("Exception: " + e);
   e.printStackTrace();
   return null;
  }
  return fortune;
}
}

UDP就是把数据打包到packet,由于她是包传输,不同于TCP Socket字符串的直接传输,所以接受端必须也以包格式接受才行,据此可以推出她的兼容性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值