利用套接字进行网络编程

2 篇文章 0 订阅

创建两个java类,Server.java和Client.java。
Client.java代码:

package main;


import java.io.*;
import java.net.*;

public class Client {

    public static void main(String[] args) {
        // TODO code application logic here
        try{
            Socket connectToServer=new Socket("localhost",5500);//连接到本机,端口号5500
            DataInputStream inFromServer=new DataInputStream(
                                    connectToServer.getInputStream());//将数据输入流连接到socket上
            DataOutputStream outToServer=new DataOutputStream(
                                    connectToServer.getOutputStream());//将数据输出流连接到socket上
            System.out.println("输入半径数值发送到服务器,输入bye结束。");
            String outStr,inStr;
            boolean goon=true;
            BufferedReader buf=new BufferedReader(
                                    new InputStreamReader(System.in));//将用户输入的数据保存在buf中
            while(goon){
                outStr=buf.readLine();//读入用户的输入
                outToServer.writeUTF(outStr);//写到已经连接socket的数据输出流中
                outToServer.flush();//flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满.
                inStr=inFromServer.readUTF();//从已经连接socket的数据输入流中读数据(就是说读服务器返回的数据)
                if(!inStr.equals("bye"))//如果返回的不是bye,就输出返回的数据
                    System.out.println("从服务器返回的结果是"+inStr);
                else                           //否则结束客户端的输入
                    goon=false;
            }
            inFromServer.close();   //关闭输入流
            outToServer.close();     //关闭输出流
            connectToServer.close();//关闭socket
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

Server.java代码:

package main;

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args){
        try{
            System.out.println("等待连接");
            ServerSocket serverSocket=new ServerSocket(5500);//服务端创建监听端口的ServerSocket
            Socket connectToClient=serverSocket.accept();
           //ServerSocket对象调用accept()方法在指定的端口监听到来的连接。accept()一直处于阻塞状态,直到有客户端试图建        //立连接。这时accept()方法返回连接客户端与服务器的Socket对象
            System.out.println("连接请求来自"+
                               connectToClient.getInetAddress().getHostAddress());//获得套接字连接的地址
            DataInputStream inFromClient=new DataInputStream(
                               connectToClient.getInputStream());//获得套接字所用的输入流
            DataOutputStream outToClient=new DataOutputStream(
                               connectToClient.getOutputStream());//获得套接字所用的输出流
            String str;
            double radius,area;
            boolean goon=true;
            while(goon){
                str=inFromClient.readUTF();
                if(!str.equals("bye")){
                    radius=Double.parseDouble(str);//字符串封装为double型
                    System.out.println("接收到的半径值为:"+radius);
                    area=radius*radius*Math.PI;
                    str=Double.toString(area);//double封装为字符串类型
                    outToClient.writeUTF(str);
                    outToClient.flush();
                    System.out.println("圆面积"+str+"已经发送");
                }else{
                    goon=false;
                    outToClient.writeUTF("bye");
                    outToClient.flush();
                }
            }
            inFromClient.close();
            outToClient.close();
            serverSocket.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

}

运行结果:
先运行Server.java,右键运行文件,

再运行Client.java,

可见连接成功。
在客户端输入2,

从服务器返回结果成功。


注:
1、

BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));

上面可以写成:

InputStream input = System.in;  
BufferedReader buf = new BufferedReader(new InputStreamReader(input));   

2、

connectToClient.getInetAddress().getHostAddress();

socket.getInetAddress()返回InetAddress对象包含远程计算机的IP地址。InetAddress.getHostAddress()返回String对象与该地址的文本表示。可以写成:

InetAddress addr = socket.getInetAddress();
String remoteIp = addr.getHostAddress();

总结
Socket是网络驱动层提供给应用程序的接口和一种机制,能执行7种基本操作:
(1)连接到远程机器
(2)绑定到端口
(3)接收从远程极其来的绑定端口上的连接
(4)监听到达的数据
(5)发送数据
(6)接收数据
(7)关闭连接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值