Java——NetWork(一)

来源:互联网 发布:sendto目标端口号 编辑:程序博客网 时间:2024/06/06 16:35

-_-直接从多线程就蹦到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            }        }    }}

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

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

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

原创粉丝点击