网络编程二:socket编程

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一。如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的。



服务端用ServerSocket监听指定的端口,端口号随意(1-1023的端口属于保留端口,在一些操作系统中不可以随意使用,建议使用大于1024的端口),等待客户端连接请求,客户端连接后,开始会话。


客户端用Socket对网络上某一个服务器的某一个端口发出连接请求,连接成功后,开始会话。客户端不需要指定自身的端口,只需要指定发出请求的目标地址和端口。


服务端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class server {

    public static void main(String[] args){
        ServerSocket server;
        Socket socket = null;  
        BufferedReader reader = null;
        System.out.println("Server Client");

        try{
            // 指定服务器端的端口号为2016
            server = new ServerSocket(2016);
            System.out.println("Server socket created successfully.");
            while (true){
                System.out.println("Waiting for connection from client...");
                // 建立连接
                socket = server.accept();
                System.out.println("Connected successfully!");
                // 打开输入流socket.getInputStream() 接收客户端发来的数据
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));

                try {
                    while (true){
                        //输出得到的数据
                        System.out.println("Info from client: " + reader.readLine());
                    }
                }catch (Exception e){
                    System.out.println("Client is offline.");
                }finally {
                    try {
                        if (reader != null){
                            reader.close();
                        }
                        if (socket != null){
                            socket.close();
                        }
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

客户端:

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

public class client {

    public static void main(String[] args){
        Socket socket = null;
        OutputStreamWriter outSW = null;
        BufferedWriter bw = null;
        BufferedReader br = null;
        String inputStr = null;

        System.out.println("Socket Client");
        System.out.println("Try to connect server...");
        try {
            //创建socket对象,指定服务器的ip地址,和服务器监听的端口号
            // 客户端在new的时候,就发出了连接请求,服务器端就会进行处理
            socket = new Socket("127.0.0.1", 2016);
            System.out.println("Connect completed.");
            //获取服务端客户端的ip和端口
            InetAddress serverAddress = socket.getInetAddress();
            String serverIP = serverAddress.getHostAddress();
            int serverPort = socket.getPort();
            InetAddress localAddress = socket.getLocalAddress();
            String clientIP = localAddress.getHostAddress();
            int clientPort = socket.getLocalPort();
            System.out.println("Server IP: " + serverIP + ", Port: " + serverPort);
            System.out.println("Client IP: " + clientIP + ", Port: " + clientPort);

            System.out.println("输入字符 就会传到server 输入QUIT就会关闭client");
            System.out.print("input:");
            //用system.in来获取控制台中输入的字符串
            br = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));
            while((inputStr = br.readLine()) != null) {
                if(inputStr.equals("QUIT")) {
                    //当控制台输入QUIT的时候直接跳出循环
                    System.exit(0);
                }
                System.out.println("你输入的是: "+inputStr);
                // 打开输出流socket.getOutputStream() 写入数据
                outSW = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");  
                bw = new BufferedWriter(outSW);
                //write来写出数据给服务器
                bw.write(inputStr);
                bw.flush();  
                System.out.print("input:");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {  
            try {
                if (bw != null){
                    bw.close();
                }
                if (outSW != null){
                    outSW.close();
                }
                if (br != null){
                    br.close();
                }
                if (socket != null){
                    socket.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        } 

    }
}

服务端步骤:
1、new ServerSocket(2016)指定端口号
2、server.accept()建立连接
3、socket.getInputStream()接收客户端发来的信息
4、输出数据
5、关闭IO流,释放资源
6、关闭socket

客户端步骤:
1、new Socket(“127.0.0.1”, 2016)指定访问的地址和端口号
2、打开输出流socket.getOutputStream() 写入数据
3、write()写出数据给服务器,需要马上flush()
4、关闭IO流,释放资源
5、关闭socket

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值