基于TCP/IP和UDP的socket编程

我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP和UDP/TP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

1.基于UDP/IP的socket编程

 

 
  1. /**
  2.  *UDPServer
  3.  *@author Winty wintys@gmail.com
  4.  *@version 2008-12-15
  5.  */
  6. import java.io.*;
  7. import java.net.*;
  8. class UDPServer{
  9.     public static void main(String[] args)throws IOException{
  10.         DatagramSocket  server = new DatagramSocket(5050);
  11.         byte[] recvBuf = new byte[100];
  12.         DatagramPacket recvPacket 
  13.             = new DatagramPacket(recvBuf , recvBuf.length);
  14.         server.receive(recvPacket);
  15.         String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
  16.         System.out.println("Hello World!" + recvStr);
  17.         int port = recvPacket.getPort();
  18.         InetAddress addr = recvPacket.getAddress();
  19.         String sendStr = "Hello ! I'm Server";
  20.         byte[] sendBuf;
  21.         sendBuf = sendStr.getBytes();
  22.         DatagramPacket sendPacket 
  23.             = new DatagramPacket(sendBuf , sendBuf.length , addr , port );
  24.         server.send(sendPacket);
  25.         server.close();
  26.     }
  27. }

  1. /**
  2.  *UDPClient
  3.  *@author Winty wintys@gmail.com
  4.  *@version 2008-12-15
  5.  */
  6. import java.io.*;
  7. import java.net.*;
  8. class UDPClient{
  9.     public static void main(String[] args)throws IOException{
  10.         DatagramSocket client = new DatagramSocket();
  11.         
  12.         String sendStr = "Hello! I'm Client";
  13.         byte[] sendBuf;
  14.         sendBuf = sendStr.getBytes();
  15.         InetAddress addr = InetAddress.getByName("127.0.0.1");
  16.         int port = 5050;
  17.         DatagramPacket sendPacket 
  18.             = new DatagramPacket(sendBuf ,sendBuf.length , addr , port);
  19.         client.send(sendPacket);
  20.         byte[] recvBuf = new byte[100];
  21.         DatagramPacket recvPacket
  22.             = new DatagramPacket(recvBuf , recvBuf.length);
  23.         client.receive(recvPacket);
  24.         String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());
  25.         System.out.println("收到:" + recvStr);
  26.         client.close();
  27.     }
  28. }

2.基于TCP/IP的socket编程


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {

    // 设置端口号
    public static int portNo = 8082;

    public static void main(String[] args) throws IOException {
        //1.创建socket服务端对象  
        ServerSocket s = new ServerSocket(portNo);
        System.out.println("The Server is start: " + s);
        // 2.阻塞,直到有客户端连接
        Socket socket = s.accept();
        try {
            System.out.println("Accept the Client: " + socket);
            //设置IO句柄
            //3.获取输入流准备取客户端发送的数据  
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            while (true) {
                String str = in.readLine();
                if (str.equals("byebye")) {
                    break;
                }
                System.out.println("In Server reveived the info: " + str);
                //Writer向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。
                //它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入
                //PrintWriter(OutputStream out)  根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
                //PrintWriter(Writer out)  创建不带自动行刷新的新 PrintWriter。
                //这两种构造方法。由于PrintWriter能够实现自动刷新所以又衍生出另两种:
                //PrintWriter(OutputStream out, boolean autoFlush)  
                //通过现有的 OutputStream 创建新的 PrintWriter。
                //PrintWriter(Writer out, boolean autoFlush)  创建新 PrintWriter
                //http://blog.csdn.net/zsw2zkl/article/details/7209734
                //4.接受客户端数据和写数据
                out.println(str);
            }
        } finally {
            System.out.println("close the Server socket and the io.");
            //5.释放资源 
            socket.close();
            s.close();

        }

    }

}

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class SocketClient {

    static String clientName = "Mike";
    //端口号
    public static int portNo = 8082;

    public static void main(String[] args) throws IOException {
        // 设置连接地址类,连接本地
        InetAddress addr = InetAddress.getByName("localhost");
        //1.创建客户端,绑定端口,IP
        Socket socket = new Socket(addr, portNo);
        try {
            System.out.println("socket = " + socket);
            //2.将服务端的数据打印出来  设置IO句柄
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //3.向服务端发送数据
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            out.println("Hello Server,I am " + clientName);
            String str = in.readLine();
            System.out.println(str);
            out.println("byebye");
        } finally {
            System.out.println("close the Client socket and the io.");
            //4.释放资源 
            socket.close();
        }

    }

}



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值