文档章节

【JAVA】Java Sockets编程

王选易
 王选易
发布于 2013/05/27 22:36
字数 701
阅读 618
收藏 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;
}

© 著作权归作者所有

王选易

王选易

粉丝 99
博文 20
码字总数 20066
作品 3
南京
程序员
私信 提问
加载中

评论(0)

【JAVA】利用java-RMI进行大文件传输

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

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

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

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

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

noday
2014/04/25
138
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
294
0
Oracle的JDBC驱动的版本你了解吗?

classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多...

i33
2012/02/20
353
0

没有更多内容

加载失败,请刷新页面

加载更多

蟒周刊-409-PyCon2020US 按时开始注册,没受疫情影响

原文: PyCoder's Weekly - Issue #409 200205 Zoom.Quiet(大妈) 用时 42 分钟 完成快译 200205 Zoom.Quiet(大妈) 用时 17 分钟 完成格式转抄. 分析NBA助攻: 如何使用Python可视化数据中的隐藏...

ZoomQuiet
3分钟前
6
0
完结篇 | TiDB Binlog 源码阅读系列文章 (九)同步数据到下游

上篇文章介绍了用于将 binlog 同步到 MySQL / TiDB 的 Loader package,本文往回退一步,介绍 Drainer 同步到不同下游的机制。 TiDB Binlog(github.com/pingcap/tidb-binlog)用于收集 TiDB...

TiDB
14分钟前
31
0
2019年终总结

因为很久没有连续动手写代码了,所有OSC也来的没那么勤快了,今天来写一下2019年的总结。 2019年怀着满腔热血进到新的公司,上半年如火如荼的进行,因为是创业型公司,所以我针对公司发展研发...

赵传喜
19分钟前
37
0
设计模式简介

一、设计模式简介 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

fairy1674
22分钟前
37
0
除了“向日葵”远程桌面办公软件,你还知多少?

一般主流的远程桌面软件就是向日葵,但如果你是用来管理服务器的话,可以推荐使用一款面板软件,叫云帮手(官网地址)不仅有普通的服务器管理功能,也有远程连接服务器的功能,操作步骤也很简...

欢乐马在开源
25分钟前
36
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部