Java中的Socket编程(1)-入门

[size=medium]
[b]不积跬步,无以至千里![/b]
意思是说不一小步一小步的积累,无法到达一千里的地方。同理,学习,做事,做技术也是一样,要一步一个脚印,不断积累,不畏艰难,才能最终达到目的。

今天来总结一个Socket中的一些知识点,由于Socket中涉及的内容比较多,这里分几次来阐述。这次主要做一个入门:

[b]1、Socket是什么?[/b]
网络上两个程序是通过一个双向链路来实现数据交换的,这个双向链路中其中的一端称为一个Socket,通信两端各有一个Socket。Socket通常是用来实现客户端和服务端的连接。一个Socket由一个IP地址和一个端口号唯一确定。

[b]2、Socket的有关知识点:[/b]
Java Socket编程中涉及的两个概念:ServerSocket 和 Socket
1)[b]ServerSocket:[/b]是服务端套接字。在服务端中监听某个端口号,当发现客户端有Socket试图连接它时,它会通过accept方法接受请求,并在服务端建立对应的Socket与客户端进行通信。此时,通信双方各有了一个Socket,通信双方均可以往Socket读写数据。
2)[b]Socket:[/b]是客户端套接字。客户端与指定的主机和端口号进行连接,当连接成功之后,客户端就可以往服务端读写数据。

[b]3、开发一个Socket程序的一般步骤:[/b]
1)创建一个Socket
2)打开连接到Socket的输入或输出流
3)按照一定的协议往流中读写数据
4)关闭Socket

[b]4、一个简单的Socket实例[/b]
需求:实现一个简单Server-Client程序。即客户端往服务端写一段数据,服务端在接收到数据之后,打印在控制台中。

[b]1)服务端代码:[/b]
[/size]

/**
* 服务端
* 需求:客户端写,服务端读
* @author Sam
*
*/
public class SimpleServer {

/**
* @param args
*/
public static void main(String[] args) {

try {
// 创建一个服务端ServerSocket,监听指定端口的请求
ServerSocket ss = new ServerSocket(9999);
// 监听客户端请求
Socket socket = ss.accept();
// 与客户端建立连接之后,就可以读取客户端发过来的信息
InputStream is = socket.getInputStream();

byte[] buffer = new byte[1024];
int len = 0;
// 定义一个字符串构建器,用于存储客户端发过来的数据
StringBuilder sBuilder = new StringBuilder();
while ( (len=is.read(buffer)) != -1 ) {
sBuilder.append(new String(buffer, 0, len));
}
is.close();// 关闭资源
socket.close();
ss.close();

System.out.println("Server: 来自客户端的信息 : " + sBuilder.toString());

} catch (IOException e) {
e.printStackTrace();
}
}

}

[size=medium]
这里需要注意的是:
1)端口号的取值范围是0-65535,但是由于0-1023为保留端口号,这些端口号提供一些特定的服务,所以我们这里端口号的选择最好是在1024-65535之间。
2)服务端在监听客户端请求时,accept方法是阻塞方法,即服务端在没有接收到客户端请求时,一直处于等待状态,accpet方法往下的代码不会被执行。

[b]2)客户端代码:[/b]
[/size]

/**
* 客户端
* @author Sam
*
*/
public class SimpleClient {

/**
* @param args
*/
public static void main(String[] args) {

try {
// 与服务端建立连接(服务端主机号,服务端监听的端口号)
Socket socket = new Socket("192.168.123.150", 9999);
// 与服务端建立连接之后,就可以往服务端写数据
OutputStream out = socket.getOutputStream();
out.write("Hello Server".getBytes());
out.flush();// 刷新输出流缓冲区
out.close();
socket.close();

} catch (IOException e) {
e.printStackTrace();
}
}

}

[size=medium]
客户端代码很简洁,与指定主机和端口号建立连接,连接成功之后,获取Socket中的输出流,往流中写一段数据,刷新数据缓冲区,最后关闭资源。

[b]程序运行结果:[/b]
注意:先运行Server程序,再运行Client程序。结果如下:

[img]http://dl2.iteye.com/upload/attachment/0095/9539/4949bcb0-bd6a-361a-9c82-91fd8ea5ca43.jpg[/img]

[b]运行结果分析:[/b]
1)运行服务端程序之后,控制台应该有一个红点,因为服务端在accept方法中处于阻塞状态,等待客户端接入;
2)当运行客户端程序之后,服务端就会监听到客户端的接入,并建立对应的Socket与客户端进行通信。

这便是一个最简单的Socket程序!客户端写,服务端读。有了这些基础之后,以后便可以一点一点的扩展。
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值