文档章节

TCP

d
 danere
发布于 2016/05/11 23:42
字数 1113
阅读 1
收藏 0

一、Socket是什么:

Socket是连接运行在网络上的两个程序间的双向通讯的端点。

为了能够方便的开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调socket(套接字)。socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。

二、使用Socket进行网络通信的过程:

1.服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。

2.客户程序根据服务器程序所在的主机名和端口号发出连接请求。

3.如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。

4.客户和服务器通过读、写套接字进行通讯。

三、使用ServerSocket和Socket实现服务器端和客户端的 Socket通信总结:

1.建立Socket连接

2. 获得输入/输出流

3.读/写数据

4.关闭输入/输出流

5. 关闭Socket

Server端

 1 import java.net.ServerSocket;
 2 import java.net.Socket;
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStream;
 8 import java.io.OutputStreamWriter;
 9 import java.io.PrintWriter;
10 
11 /*
12  * 基于TCP协议的Socket通信,实现用户登陆
13  * 服务器端
14  */
15 public class Server {
16     public static void main(String[] args) {
17         try {
18             // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
19             ServerSocket serverSocket = new ServerSocket(8888);
20             Socket socket = null;
21             System.out.println("服务器启动");
22 
23             // 监听等待客户端的连接
24             socket = serverSocket.accept();
25 
26             InputStream is = socket.getInputStream();
27             InputStreamReader isr = new InputStreamReader(is);
28             BufferedReader br= new BufferedReader(isr);
29 
30             String a;
31             while ((a = br.readLine()) != null) {
32                 System.out.println("用户信息:" + a);
33             }
34             
35             OutputStream os = socket.getOutputStream();
36             OutputStreamWriter osw=new OutputStreamWriter(os);
37             //osw.write("asd");
38             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
39             pw.write("welcome");
40             pw.flush();
41             
42             osw.close();
43             os.close();
44             br.close();
45             isr.close();
46             is.close();
47             
48             socket.close();
49             serverSocket.close();
50             
51         } catch (IOException e) {
52             e.printStackTrace();
53         }
54     }
55 }
View Code

Client端

 1  package test_1;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStream;
 8 import java.io.PrintWriter;
 9 import java.net.Socket;
10 import java.net.UnknownHostException;
11 
12 /*
13  * 客户端
14  */
15 public class Client {
16     public static void main(String[] args) {
17         try {
18             //创建客户端Socket,指定服务器地址和端口
19             Socket socket=new Socket("localhost", 8888);
20             //获取输出流,向服务器端发送信息
21             OutputStream os=socket.getOutputStream();//字节输出流
22             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
23             pw.write("用户名:alice;密码:789");
24             pw.flush();
25             socket.shutdownOutput();//关闭输出流
26             //获取输入流,并读取服务器端的响应信息
27             InputStream is=socket.getInputStream();
28             BufferedReader br=new BufferedReader(new InputStreamReader(is));
29             String info=null;
30             while((info=br.readLine())!=null){
31                 System.out.println("我是客户端,服务器说:"+info);
32             }
33             //4.关闭资源
34             br.close();
35             is.close();
36             pw.close();
37             os.close();
38             socket.close();
39         } catch (UnknownHostException e) {
40             e.printStackTrace();
41         } catch (IOException e) {
42             e.printStackTrace();
43         }
44     }
45 }
View Code

 多线程的Server端:

 1 package test_1;
 2 
 3 import java.net.InetAddress;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 import java.io.IOException;
 7 
 8 /*
 9  * 基于TCP协议的Socket通信,实现用户登陆
10  * 服务器端
11  */
12 public class Server {
13     public static void main(String[] args) {
14         try {
15             // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
16             ServerSocket serverSocket = new ServerSocket(8888);
17             Socket socket = null;
18             System.out.println("服务器启动");
19             
20             while(true){
21                 // 监听等待客户端的连接
22                 socket = serverSocket.accept();
23                 
24                 Serverthread serverthread=new Serverthread(socket);
25                 
26                 serverthread.start();
27                 InetAddress address=socket.getInetAddress();
28                 System.out.println("当前客户端的IP:"+address.getHostAddress());
29             }
30 
31             
32         } catch (IOException e) {
33             e.printStackTrace();
34         }
35     }
36 }
37 
38 
39 package test_1;
40 
41 import java.io.BufferedReader;
42 import java.io.IOException;
43 import java.io.InputStream;
44 import java.io.InputStreamReader;
45 import java.io.OutputStream;
46 import java.io.OutputStreamWriter;
47 import java.io.PrintWriter;
48 import java.net.Socket;
49 
50 public class Serverthread extends Thread{
51     Socket socket=null;
52     
53     public Serverthread(Socket socket) {
54         this.socket=socket;
55     }
56     
57     public void run() {
58         try {
59             InputStream is = socket.getInputStream();
60             InputStreamReader isr = new InputStreamReader(is);
61             BufferedReader br= new BufferedReader(isr);
62 
63             String a;
64             while ((a = br.readLine()) != null) {
65                 System.out.println("用户信息:" + a);
66             }
67             
68             OutputStream os = socket.getOutputStream();
69             OutputStreamWriter osw=new OutputStreamWriter(os);
70             //osw.write("asd");
71             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
72             pw.write("welcome");
73             pw.flush();
74             
75             osw.close();
76             os.close();
77             br.close();
78             isr.close();
79             is.close();
80             
81             socket.close();
82         } catch (IOException e) {
83             // TODO 自动生成的 catch 块
84             e.printStackTrace();
85         }
86         
87     };
88 }

 

本文转载自:http://www.cnblogs.com/daneres/p/4670735.html

上一篇: Junit3.8 Stack测试
下一篇: 异常(Exception)
d
粉丝 0
博文 51
码字总数 0
作品 0
泉州
私信 提问

暂无文章

ES6

ES6:不改变原理的基础上,让API变得更简单 一、let:代替var用于声明变量 1、var的缺点: (1)声明提前 (2)没有块级作用域 2、let的优点: (1)组织了申明提前 (2)让let所在的块({}),...

wytao1995
今天
3
0
kubernetes 环境搭建 —— minikube

创建集群 minikube start 搭建好 k8s 集群后,可以查看集群的状态以及部署应用。主要用到的是 k8s 的 api,这通常需借助于 kutectl 命令行工具 基本操作 kubectl versionkubectl cluster-i...

lemos
今天
9
0
关于js混淆与反混淆还原操作

使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密,或者混淆js来达到代码保护。 1、为什么...

开源oschina
今天
11
0
用盛金公式解三次方程(ansi c版)

/* cc cubic.c -lm gcc cubic.c -lm Shengjin's Formulas Univariate cubic equation aX ^ 3 + bX ^ 2 + cX + d = 0, (a, b, c, d < R, and a!= 0). Multiple root disc......

wangxuwei
今天
9
0
JBolt开发平台入门(16)- 弹出Dialog显示指定区域的html内容

在JBolt里,有个主从表Demo。 子表中除了普通的table显示,还有其它从表显示形式 比如下方案例:是针对一个升级管理子表中存放版本的changelog富文本信息。 需求是点击左上角的弹出查看按钮,...

山东-小木
今天
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部