-_-直接从多线程就蹦到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
}
}
}
}
写完啦~我们来看一下运行结果
注意注意!运行时要先开启服务端,再开启客户端
服务端运行图片:
客户端运行图片:
写完啦写完啦~~~
这个程序看似比较简单但是里面涉及到的知识是非常多的嗯,多到我懒得写,写也写不完-_-
我还有最后一句话:我爱学习,学习使我快乐