java tcp socket实例

网络编程的基本模型就是客户端到服务器端模型,一段必须提供一个固定位置,而另一端只需要知道这个固定的位置,并去建立两者之间的联系

Socket有两种主要操作方式:面向连接和无连接的。面向连接就像一部电话,必须先建立一个连接和一个呼叫,所有的事情到达的顺序和他们出发顺序相同,这就是tcp协议的实现场景
无连接的socket像一个邮件投递,没有什么保证,多个邮件可能在到达时的顺序域出发时的顺序不一样。无连接使用数据报协议,一个数据报包含了所有这次投递的信息,把它想象成信封,有目的地址和要发送的内容,这个模式下的socket不需要连接一个目的地,只是简单的投出数据报,这就是UDP协议的实现场景


下面是一个tcp socket实例程序

客户端:
package socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class MyClient {

public static void main(String[] args) {
MyClient c = new MyClient();
try {
c.callServer();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
private void callServer() throws UnknownHostException, IOException {

int reqInt = 23;
Socket s = new Socket("localhost",8888); //客户端给出IP和端口号

InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);

dos.writeInt(reqInt);
dos.flush();
int serverInt = dis.readInt();
System.out.println("server answer "+reqInt+"*18 = "+serverInt);
dis.close();
dos.close();

}

}

服务器端;
package socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {

public MyServer(){

}
public static void main(String[] args){
MyServer ms = new MyServer();
try {
ms.listen(8888);
} catch (IOException e) {
e.printStackTrace();
}
}
private void listen(int port) throws IOException {

ServerSocket server = new ServerSocket(port);
Socket socket = server.accept();
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
int receiveInt = dis.readInt(); //读取客户端请求
System.out.println("The message from client is:"+receiveInt);
dos.writeInt(receiveInt*18); //返回client端
dos.flush(); //强制清空缓冲区
dos.close();
dis.close();
is.close();
os.close();


}
}

命令行中执行结果如下:
先启动服务器端没有任何反应

[img]http://dl.iteye.com/upload/attachment/357828/15085679-91a8-3055-96c8-1cd8fbe12627.jpg[/img]
再启动客户端,向服务器端发送请求,并在客户端显示服务器端的响应

[img]http://dl.iteye.com/upload/attachment/357826/fb4cd3b7-a6df-3318-bfbb-6ef6c549965b.jpg[/img]
服务器端接收请求后

[img]http://dl.iteye.com/upload/attachment/357830/edb9d95d-9568-3b8a-b0c6-850ed9d2ce18.jpg[/img]
[b]注意:一次请求完成后就结束自己的生命周期,服务器只能处理一次客户端请求,请求结束,连接即释放,看下一篇tcp socket实例(改进)[/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值