文档章节

【JAVA】Java Sockets编程

王选易
 王选易
发布于 2013/05/27 22:36
字数 701
阅读 604
收藏 6

#Java Sockets编程

TCP提供了一个可靠的,点对点的客户端-服务器应用通道,想要在TCP上进行传输,客户端程序与服务器程序需要建立彼此的连接。客户端和服务器都是对与连接绑定的socket进行读和写来传输数据。


##What is a Socket?

客户端请求数据的过程:

在此输入图片描述

服务器listen到之后,accept这个请求并与client进行连接

在此输入图片描述

  • 定义:socket是一个互联网上双向连接中的一个端点(An endpoint)。 java.net包提供了两个class:Socket、ServerSocket,分别实现了客户端与服务器端的连接。

端点(An endpoint)是IP地址与端口号的结合。每个TCP连接都有他的两个端点唯一确定

另外,如果你想连接Web,URL class和相关类(URLConnection,URLEncoder)可能比sokect更加合适,实际上,URLs 是对Web的一种相对高层的连接,sockets则作为底层实现


##Reading from and writing to a Socket

package demo;

import java.io.*;
import java.net.*;

public class EchoClient {

public static void main(String args[]) throws IOException {
	
	Socket echoSocket = null;
	PrintWriter out = null;
	BufferedReader in = null;
	
	try{
		echoSocket = new Socket("taranis", 7);
		//write to the socket
		out = new PrintWriter(echoSocket.getOutputStream(), true);
		//read the socket
		in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
		
	}catch (UnknownHostException e){
		System.err.println("Don't know about host");
		System.exit(1);
	}catch (IOException e){
		System.err.println("couldn't get I/O for the connection to taranis");
		System.exit(1);
	}
	
	BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
	String userInput;
	
	while((userInput = stdIn.readLine())!= null) {
		out.println(userInput);
		System.out.println("echo : " + in.readLine());
	}
	
	out.close();
	in.close();
	stdIn.close();
	echoSocket.close();
	}
}

在应用中,应遵守如下顺序:

  1. Open a socket.
  2. Open an input stream and output stream to the socket.
  3. Read from and write to the stream 4. according to the server's protocol.
  4. Close the streams.
  5. Close the socket.

##Writing the Server Side of a Socket

###The Knock Knock Server

Socket clientSocket = null;
	try {
		clientSocket = serverSocket.accept();
	} 
	catch (IOException e) {
		System.out.println("Accept failed: 4444");
		System.exit(-1);
	}	

accept方法一直到客户端启动并向服务器发出请求为止一直在等待。但注意,此方法不支持多个客户端同时访问

KnockKnockProtocol kkp = new KnockKnockProtocol();

outputLine = kkp.processInput(null);
out.println(outputLine);

while ((inputLine = in.readLine()) != null) {
     outputLine = kkp.processInput(inputLine);
     out.println(outputLine);
     if (outputLine.equals("Bye."))
        break;
}

这段代码:

  1. 得到socket的inputstream&outputstream,在stream上打开reader和writer
  2. 通过向socket写操作来初始化传输
  3. 与客户端进行读和写

readLine方法一直等到客户端对socket的outputstream写入(对服务器socket的inputstream的写入)才运行

###The Knock Knock Protocol

所有的服务器/客户端对必须有他们用于对话某种协议,否则,来回传送的数据就变得没有意义了。协议取决于你要完成什么任务

###Supporting Multiple Clients

多用户请求实际上可以从一个port进入,客户端的请求在服务器端排成队列。所以服务器必须按顺序解决他们。通过多线程来解决问题

如下:

while (true) {
	accept a connection;
	create a thread to deal with the client;
}

© 著作权归作者所有

共有 人打赏支持
王选易
粉丝 90
博文 20
码字总数 20066
作品 3
南京
程序员
私信 提问
【JAVA】利用java-RMI进行大文件传输

点击进入我的新博客 利用java-RMI进行大文件传输 为什么要用RMI 在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sock...

王选易
2013/05/28
0
19
Java 7 的新特性一览表

官方说是 7月28日 正式发布 Java 7 ,正常的话我们应该在 7月29日 看到这个版本。很快了,就两天时间。 发布之前让我们先来看看 Java 7 都有什么新特性吧。 Java 7 的架构图: 新特性一览表:...

红薯
2011/07/27
76.3K
83
Java并发教程-1进程和线程

http://www.iteye.com/magazines/131 计算机的使用者一直以为他们的计算机可以同时做很多事情。他们认为当其他的应用程序在下载文件,管理打印队列或者缓冲音频的时候他们可以继续在文字处理...

noday
2014/04/25
0
0
java连接各种数据库(mysql,sql server,oracle,db2)

MYSQL: private String conUrl ="jdbc:mysql://localhost:3306/数据库"网站推广 Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(conUrl,"用户名","密码"); S......

网络营销
2012/01/09
0
0
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Web安全之XSS攻击与防御小结

Web安全之XSS攻防 1. XSS的定义 跨站脚本攻击(Cross Site Scripting),缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从...

前端小攻略
21分钟前
1
0
JavaScript中的继承及实现代码

JS虽然不像是JAVA那种强类型的语言,但也有着与JAVA类型的继承属性,那么JS中的继承是如何实现的呢? 一、构造函数继承 在构造函数中,同样属于两个新创建的函数,也是不相等的 function Fn...

peakedness丶
24分钟前
1
0
记一次面试最常见的10个Redis"刁难"问题

导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。 Redis在...

小刀爱编程
37分钟前
13
0
TiDB Lab 诞生记 | TiDB Hackathon 优秀项目分享

本文由红凤凰粉凤凰粉红凤凰队的成员主笔,他们的项目 TiDB Lab 在本届 TiDB Hackathon 2018 中获得了二等奖。TiDB Lab 为 TiDB 培训体系增加了一个可以动态观测 TiDB / TiKV / PD 细节的动画...

TiDB
50分钟前
4
0
当区块链遇到零知识证明

本文由云+社区发表 当区块链遇到零知识证明 什么是零知识证明 零知识证明的官方定义是能够在不向验证者任何有用的信息的情况下,使验证者相信某个论断是正确的。这个定义有点抽象,下面笔者举...

腾讯云加社区
59分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部