Java——NetWork(一)

-_-直接从多线程就蹦到Network部分了,绝对不是因为我懒!!!
其实身为软件工程专业的一个小白,从大二的计算机网络开始就天天听老师念叨socket编程,后来选修了TCP/IP协议与网络编程又是天天说socket编程,可是这些老师总是天天说socket编程也从来没有讲过啥是个socket…以至于我一直觉得这个东西十分的神秘。下面说一下在java中的socket编程是什么样的。(内容摘取自网络如有侵权,请联系我立即删除)


JAVA Socket简介

所谓socket 通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

以J2SDK-1.3为例,Socket和ServerSocket类库位于Java.NET包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

重要的Socket API:

java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见API文档

  1. .Accept方法用于产生”阻塞”,直到接受到一个连接,并且返回一个客户端的Socket对象实例。”阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,然后程序继续;通常”阻塞”是由循环产生的。
  2. . getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
  3. . getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

这里侧重Java中的socket编程,至于什么网络中的一些基本原理分层结构什么的就暂且不提了

进入正题:socket编程就是两个进程,跨计算机,他俩需要通讯的话,需要通过网络对接起来。所以我们需要编写两个进程来进行通讯这两个进程也就是C/S结构中的客户端(Client)和服务端(Server)

  1. 服务端:通过socket接收客户端发来的消息,做出处理后返还给客户端
package com.briup.chap11;

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

public class ServerTest {
    public static void main(String[] args) {
        // 使用ServerSocket代表基于TCP/IP协议建立的服务端
        ServerSocket server = null;
        // 输入流用于接收客户端发来的消息
        BufferedReader in = null;
        // 输出流用于将消息返还给客户端
        PrintWriter out = null;

        try {
            // 创建ServerSocket对象,调用构造器ServerSocket(int port)指定端口号port
            // 对象创建,代表服务端已经启动,网络资源也需要关闭
            server = new ServerSocket(9999);
            // 9999为服务端的端口号
            // 1-1000端口号操作系统默认应用占用,还有特殊的端口
            // eg.tomcat-8080 orcal-1521 mysql-3306 ...
            // 大数据软件占用端口 16010-hbase 9000-hdfs 2080-zookeeper
            System.out.println("正在等待连接...");

            // accept对象不为空代表服务端和客户端建立成功
            // 没有客户端连接时accept()方法会造成线程阻塞,等待客户端连接
            Socket accept = server.accept();
            System.out.println("客户端连接成功...");

            //创建输入流对象,调用getInputStream()方法接收客户端消息
            in = new BufferedReader(new InputStreamReader(accept.getInputStream()));
            //打印客户端发来的消息到控制台
            System.out.println("客户端:" + in.readLine());

            //创建输出流对象,调用getOutputStream()方法向客户端传递消息
            out = new PrintWriter(accept.getOutputStream());
            out.println("你好 我是服务端");
            out.flush();

            //以下为一些方法用来查看客户端中的一些信息
            String ip = accept.getInetAddress().getHostAddress();
            System.out.println("客户端ip为:" + ip);
            int c_port = accept.getPort();
            System.out.println("客户端端口号为:" + c_port);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            //关闭各种开启的资源,关闭原则:后开启的先关闭
            try {
                if (out != null) {
                    out.flush();
                    out.close();
                }
                if (in != null) {

                    in.close();
                }
                if (server != null) {
                    server.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
  1. 客户端:通过socket与服务端建立连接向服务端发送消息(一般为请求某个资源)。
package com.briup.chap11;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientTest {
    public static void main(String[] args) {
        //使用ServerSocket代表基于TCP/IP协议建立的服务端
        Socket client = null;
        //输出流向服务端发出消息
        PrintWriter out = null;
        //输入流接收服务端消息
        BufferedReader in = null;
        try {
            System.out.println("客户端准备连接服务端...");
            Thread.sleep(1000);
            // 对象建立即代表连接成功
            //调用构造器传入两个参数
            //1.服务端所在ip地址,因为是本机所以这里写127.0.0.1
            //2.服务端的端口号,这里需要与刚才编写的服务端端口号相同
            client = new Socket("127.0.0.1", 9999);
            System.out.println("连接成功~");

            //客户端向服务端信息
            out = new PrintWriter(client.getOutputStream());
            out.println("你好");
            out.flush();
            //接收服务端消息
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            System.out.println("服务端:"+in.readLine());

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            //同样的,关闭各种资源
            try {
                if(client != null){
                    client.close();
                }
                if(in != null){
                    in.close();
                }
                if(out != null){
                    out.close();
                }
            } catch (Exception e2) {
                // TODO: handle exception
            }
        }
    }
}

写完啦~我们来看一下运行结果
注意注意!运行时要先开启服务端,再开启客户端
服务端运行图片:
这里写图片描述
客户端运行图片:
这里写图片描述

写完啦写完啦~~~
这个程序看似比较简单但是里面涉及到的知识是非常多的嗯,多到我懒得写,写也写不完-_-

我还有最后一句话:我爱学习,学习使我快乐

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值