Internet_worm
Internet_worm的博客

导航

 

线程安全的下一篇更新

目前主流的网络通信协议是UDP和TCP,下边分别接受基于这两种方式的编程基础

 

UDP编程:

 

UDP发送端步骤:

1、创建socket服务

DatagramSocket socket=new DatagramSocket();

2、封装数据包

byte[] data="要发送内容".getBytes();

DatagramPacket packet=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),10000);

//因为演示都是基于本地主机之间的通信,所以IP地址用本机IP地址,端口号可在1025--65535之间选取,为了避免与其他进程重复,所以选择较大的端口

3、通过socket的send方法,发送数据

socket.send(packet);

4.关闭资源(关闭socket服务)

socket.close();

代码实现如下:

SendDenon.java

public class SendDemo{

  public static void main(String []args){

    DatagramSocket socket=new DatagramSocket();

    byte[] data="要发送内容".getBytes();

    DatagramPacket packet=new DatagramSocket(data,data.length,InteAddress.getLocalHost(),10000);

    socket.send(packet);

    socket.close(0;

  }

}

 

 

UDP接收端:

1、创建socket服务

DatagramSocket socket=new DatagramSocket();

2、创建数据包,用于接收数据

byte[] data=new byte[1024];

DatagramPacket packet=new DatagramPacket(data,data.length);

3、用socket的receive方法接收数据

socket.receive(packet);//这个方法是一个阻塞方法,被调用之后,接收端就一直处于阻塞状态,监听这个端口

4、获取数据包内容

InetAddress ip=packet.getAddress();//获取数据包的IP地址

String content=new String(packet.getData(),0,packet.getLength());

5、关闭资源

socket.close();

 

代码如下:

ReceiveDemo.java

public class ReceiveDemo{

  public static void main(String [] args){

    DatagramSocket socket=new DatagramSocket(10000);//此处锁定的端口必须跟发送端的端口一致

    byte[]data=new byte[1024];

    DatagramPacket packet=new DatagramPacket(data,data.length);

    socket.receive(packet);

    String content=new String(packet.getData(),0,packet.getLength());

    InetAddress ip=packet.getAddress();

    socket.close();

  }

}

当然,我们并不希望发送端和接收端只进行一次通信,并且发送的内容由我们自己输入,所以我们可以对代码进行下列的优化,这样我们就可以从发送端的控制台手动输入要发送的内容到接收端

SendDeno.java

public class SendDemo{

  public static void main(){

    DatagramSocket socket=new DatagramSocket();

    

    Scanner sc=new Scanner(System.in);

    while(sc.hasNext()){

      

      byte[] data=sc.nextLine().getBytes();

      DatagramPacket packet=new DatagramPacket(data,data.length,InetAddress.getLocalHost(),10000);

      socket.send(packet);

    }

  socket.close();

 

}

}

既然发送端可以持续输入发送内容,所以接收端也需要能一直监听这个端口,接收端的优化代码如下:

ReceiveDemo.java

public class ReceiveDemo{

 

  public static void main(String []args){

    DatagramSocket socket=new DatagramSocket(10000);

    byte[]data=new byte[1024];

    DatagramPacket packet=new DatagramPacket(data,data.length);

    while(true){

      socket.receive(packet);

      String content=new String(packet.getData(),0,packet.getLength());

      InetAddress ip=packet.getAddress();

      System.out.println(ip.getHostAddress+content);

 

      }

          //socket.close()因为前边的while()循环是一个死循环,下边的代码是执行不到的,所以资源关闭的步骤可以省略掉,调试代码的时候手动关闭即可

    }

}

 

TCP编程:

客户端编程步骤:

  1、创建客户端的socket服务

    Socket socket =new Socket("172.16.43.47",10000);//此处的IP地址还是本机地址,端口同上

  2、通过socket的getOutputStream()获得流对象

    OutputStream out=socket.getOutputStream();

  3、通过流对象的方法传输数据

    byte[] data="要发送内容".getBytes();

    out.write(data);

  4、关闭资源

    socket.close();

实现代码如下:

ClientDemo.java

public class ClientDemo{

  public static void main(){

    Socket socket=new Socket("172.16.43.47",10000);

    OutputStream out=socket.getOutputStream();

    byte[]data="要发送内容".getBytes();

    out.write();

    //因为TCP协议客户端和服务器端是可以进行交互的,比如在进行连接时候的三次握手,所以还要信息回写

    InputStream in=socket.getInputStream();

    byte[] buf=new byte[1024];

    int len=in.read(buf);

    String content=new String (buf,0,len);

    InetAddress ip=socket.getInetAddress();

    System.out.println(ip.getHostAddress()+"-----"+content);

    

       socket.close();

  }

}

服务器端编程:

  1、创建服务器端socket服务

    ServerSocket ss=new ServerSocket(10000);

  2、通过服务器端socket服务对象获取客户端socket服务对象

    Socket socket=ss.accept();

  3、通过socket的getInputStream方法获得流对象

    InputStream in=socket.getInputStream();

  4、通过流对象操作数据

    byte[]data=new byte[1024];

    int len=in.read(data);

  5、关闭资源

    ss.close();

    socket.close();

    

 

实现代码如下:

 

ServerDemo.java 

public class ServerDemo{

  public static void main(){

  

    ServerSocket ss=new ServerSocket(10000);

    Socket socket=ss.accept();

    InputStream in=socket.getInputStream();

    

    byte[]data=new byte[1024];

    int len=in.read(data);

    String content=new String(data,0,len);

    InetAddress ip=socket.getAddress();

    System.out.println(ip.getHostAddress()+"---"+content);

    //同理,在服务器端也需要给客户端回写信息

    OutputStream out=socket.getOutputStream();

    byte[]buf="要回写的信息".getBytes();

    out.write();

    

    ss.close();

    socket.close();

 

  }

}

同样,我们也希望tcp客户端与服务器端可以一直进行交互,代码如下,原理与UDP的交互相同

ClientDemo.java

public class ClientDemo {
public static void main(String[] args) throws Exception {

Socket socket=new Socket(InetAddress.getLocalHost(),10008);

OutputStream out=socket.getOutputStream();

Scanner sc=new Scanner(System.in);
byte[] data=new byte[1024];
while(sc.hasNext()){
data=sc.nextLine().getBytes();
out.write(data);

}

socket.close();

}

}

ServerDemo.java

public class ServerDemo {
public static void main(String[] args) throws Exception {

ServerSocket serverSocket=new ServerSocket(10008);

//通过ss的accept()方法获取客户端对象
Socket socket=serverSocket.accept();

while(true){
//通过socket获取读取流,获得发送端发送的数据,通过流对象操作数据
InputStream in=socket.getInputStream();
InetAddress ip=socket.getInetAddress();
byte[] buf=new byte[1024];
int len=in.read(buf);
String content=new String(buf,0,len);
System.out.println("ip"+"\t"+ip);
System.out.println("content"+"\t"+content);


}



}

}

 

posted on 2015-08-21 04:59  Internet_worm  阅读(94)  评论(0)    收藏  举报