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文档
- .Accept方法用于产生”阻塞”,直到接受到一个连接,并且返回一个客户端的Socket对象实例。”阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,然后程序继续;通常”阻塞”是由循环产生的。
- . getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
- . getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
这里侧重Java中的socket编程,至于什么网络中的一些基本原理分层结构什么的就暂且不提了
进入正题:socket编程就是两个进程,跨计算机,他俩需要通讯的话,需要通过网络对接起来。所以我们需要编写两个进程来进行通讯这两个进程也就是C/S结构中的客户端(Client)和服务端(Server)
- 服务端:通过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(); } } }}
- 客户端:通过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 } } }}
写完啦~我们来看一下运行结果
注意注意!运行时要先开启服务端,再开启客户端
服务端运行图片:
客户端运行图片:
写完啦写完啦~~~
这个程序看似比较简单但是里面涉及到的知识是非常多的嗯,多到我懒得写,写也写不完-_-
我还有最后一句话:我爱学习,学习使我快乐
- Java——NetWork(一)
- 弱网测试—Network-Emulator-Toolkit(一)
- Unity Network 学习(一)
- iOS-Network学习笔记(一)——NSURLRequest/NSURLResponse
- 并查集系列(一)——Social network connectivity
- 论文阅读笔记(一)——Deep Convolutional Neural Network with Independent
- “Network”游戏棋人机对弈的设计与实现(一)—游戏规则
- 卷积神经网络——Network In Network
- Neural Network Concept神经网络(一)
- Feedback Nerual Network(一):Concept
- Three20 NetWork 源码详细解析(一)
- caffe中的siamese network(一)
- poj2531——Network Saboteur(dfs)
- POJ1861——Network
- POJ1144——Network
- HDU 3078 — Network
- CAN network driver<一>
- 【java】java面试(一)——每日一题
- Centos系统怎么添加用户和组
- jsp 解析xml
- execute immediate的语法
- Hybrid APP混合开发
- Android开发培训(06)--分享文件 (二)
- Java——NetWork(一)
- Java实现生产者消费者问题与读者写者问题
- 唯品会Redis cluster大规模生产实践
- 导航栏显示和隐藏的坑
- JS架包与<base>标签冲突的问题
- Redis入门例子
- sgu220Little Bishops(dp)
- Java中this关键字和super关键字用法
- CSS相对定位和绝对定位详解