Java中的网络编程

Java中的网络编程也是通过socket来完成的,Java中的几个Socket类:

ServerSocket类:它表示监听Socket,用于TCP协议中双方建立连接。
Socket类:它是用于TCP通信的Socket类。他是TCP通信中真正用于实现双方通信类。
DatagramSocket类:用于UDP双方的通信套接字。

(一)TCP编程:

步骤描述:

服务器端:
1.创建一个ServerSocket类的对象ss,帮定到指定的端口上;
2.调用ss.accept()方法来等待客户端的连接请求,当请求到来时返回一个用于通信的套接字,即一个Socket类的对象s;
3.调用s.getOutputStream()返回一个输出流对象os,用于向客户端发送信息;
4.调用s.getInputStream()返回一个输入流对象is,用于从客户端接收信息;
5.通信;

客户端:
1.创建一个Socekt类的对象s用于通信,并将其帮定到指定IP地址和端口上;
2.调用s.getOutputStream()返回一个输出流对象os,用于向服务器端发送信息;
3.调用s.getInputStream()返回一个输入流对象is,用于从服务器端接收信息;
4.通信;

如下例:

TCPServer.java
######################################################################################################################
import java.net.*;
import java.io.*;

public class TCPServer extends Thread
{
    Socket s;
    
    TCPServer(Socket s)
    {
        this.s = s;
    }
    
    public static void main(String[] args)
    {
        try
        {
            ServerSocket ss = new ServerSocket(6000);
            while (true)
            {
                Socket s = ss.accept();
                new TCPServer(s).start(); //每有一个客户请求来就创建一个Socket来与其进行通信。
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    public void run()
    {
        try
        {
            OutputStream os = this.s.getOutputStream();
            InputStream is = this.s.getInputStream();
            
            String str = "Welcome you!";
            os.write(str.getBytes());
            int iLen = 0;
            byte[] buf = new byte[100];
            iLen = is.read(buf);
            System.out.println(new String(buf, 0, iLen));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
######################################################################################################################

TCPClient.java
######################################################################################################################
import java.net.*;
import java.io.*;

public class TCPClient extends Thread
{
    public static void main(String[] args)
    {
        try
        {
            //Socket s = new Socket(InetAddress.getByName("localhost"),6000);
            //Socket s = new Socket(InetAddress.getByName(null),6000);
            Socket s = new Socket(InetAddress.getByName("127.0.0.1"),6000); //用于本机两个进程的通信
            OutputStream os = s.getOutputStream();
            InputStream is =  s.getInputStream();
            
            String str = "Hello, I am zoulida!";
            os.write(str.getBytes());
            int iLen = 0;
            byte[] buf = new byte[100];
            iLen = is.read(buf);
            System.out.println(new String(buf, 0, iLen));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
######################################################################################################################
(二)UDP编程:
 
步骤描述:

发送方A:
1.创建一个DatagramSocket类的对象ds,它无需帮定到任何端口和IP地址上,因为通信双方不需要建立连接。
2.创建一个DatagramPacket类的对象dp,它表示要发送的数据包,在包中指定对方的IP地址和端口号。
3.调用ds.send(dp)发送数据。
4.创建一个DatagramPacket类的对象rcvdp,用于表示接收到的数据包。
5.调用ds.receive(rcvdp)从网络上接收数据。

接受方B:
1.创建一个DatagramSocket类的对象ds,并将其帮定到指定的端口上。
2.创建一个DatagramPacket类的对象dp,用于表示接收到的数据包。
3.调用ds.receive(dp)从网络上接收数据。
4.创建一个DatagramPacket类的对象senddp,它表示要发送的数据包,在包中指定对方的IP地址和端口号(这些在dp中已经有了)。
5.调用ds.send(senddp)发送数据。

如下例:
UDPSend.java
###########################################################################################
import java.net.*;

public class UDPSend
{
    public static void main(String[] args)
    {
        try
        {
            DatagramSocket ds = new DatagramSocket();
            String str = "Hi, are you there?";
            DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName(null), 6000);
            ds.send(dp);
           
            byte[] buf = new byte[100];
            DatagramPacket rcvdp = new DatagramPacket(buf, 100);
            ds.receive(rcvdp);
            System.out.println(new String(buf, 0, rcvdp.getLength()));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
###############################################################################################################

UDPReceive.java
##########################################################################################################################
import java.net.*;

public class UDPReceive
{
    public static void main(String[] args)
    {
        try
        {
            DatagramSocket ds = new DatagramSocket(6000);
            byte[] buf = new byte[100];
            DatagramPacket dp = new DatagramPacket(buf, 100);
            ds.receive(dp);
            System.out.println(new String(buf, 0, dp.getLength()));
           
            String str = "yes, I am here, how are you!";
            DatagramPacket senddp = new DatagramPacket(str.getBytes(), str.length(), dp.getAddress(), dp.getPort());  // 接收到的包中已经有了发送方的信息。
            ds.send(senddp);   
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
##########################################################################################################################

TCP与UDP的区别:
TCP要求双方建立连接,所以在建立流套接字的时候就要明确指定对方的IP地址和端口号,而建立的连接之后双方的通信就很简单了,在发送的时候
将数据扔掉流上,在接收的时候从流上取就可以了。

UDP是双方不需要建立连接,所以不需要在创建套接字时指定对方的IP地址和端口号,但在通信的时候就比较麻烦了,需要在数据包中指定
IP地址和端口号。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值