网络Socket编程TCP协议例子
1.单线程TCP服务端
public class TcpChatServer {
private Integer port=8000;
private ServerSocket serverSocket;
public static void main(String[] args)throws Exception {
new TcpChatServer().service();
}
public TcpChatServer() throws Exception {
//启动一个服务监听一个指定的端口port
serverSocket=new ServerSocket(port);
System.out.println("service started!");
}
private void service(){
while (true) {
Socket socket=null;
try {
//serversocket开始监听服务,客户端和服务端交互的socket
socket=serverSocket.accept();
System.out.println(String.format("client:%s port:%s",socket.getInetAddress(),socket.getPort()));
//获取客户端的数据对象
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//写入客户端的数据对象
PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
String word;
while ((word=reader.readLine())!=null) {
//相应请求
writer.println(reply(word));
//如果用户输入bye则退出循环
if(word.equals("bye")){
break;
}
}
} catch (IOException e) {
System.err.println(e.getMessage());
}finally{
//一定要关闭socket
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
}
}
//回复相应
private String reply(String word){
return "you said :"+word;
}
}
运行...在cmd下访问....使用telnet访问....


但是有一个问题...如果再开一个telnet访问的话输入什么都是没有效果的...只有等到第一个结束之后才会对第二个访问的telnet进行回复,如下图.

搞一个多线程的Socket服务端.
public class TcpThreadChatServer {
private Integer port=8000;
private ServerSocket serverSocket;
public static void main(String[] args)throws Exception {
new TcpThreadChatServer().service();
}
public TcpThreadChatServer() throws Exception {
//启动一个服务监听一个指定的端口port
serverSocket=new ServerSocket(port);
System.out.println("service started!");
}
private void service(){
while (true) {
Socket socket=null;
try {
//serversocket开始监听服务,客户端和服务端交互的socket
socket=serverSocket.accept();
//对于每次请求,多线程应答 可以开多个可以对多个客户端进行回应.
new Thread(new Worker(socket)).start();
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
class Worker implements Runnable{
public Worker(Socket socket) {
this.socket = socket;
}
private Socket socket;
@Override
public void run() {
try {
System.out.println(String.format("client:%s port:%s",socket.getInetAddress(),socket.getPort()));
//获取客户端的数据对象
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//写入客户端的数据对象
PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
String word;
while ((word=reader.readLine())!=null) {
//相应请求
writer.println(reply(word));
//如果用户输入bye则退出循环
if(word.equals("bye")){
break;
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
}finally{
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
}
}
//回复相应
private String reply(String word){
return "you said :"+word;
}
}
可以开启多个telnet访问 并同时处理反馈.....
可以写对应的如下客户端...通过控制台访问该服务端,不再使用telnet...
public class TcpChatClient {//客户端和服务端通话都是过socket
private Socket socket;
private String host="localhost";//要请求的服务器地址
private Integer port=8000;
public TcpChatClient() throws Exception {
//初始化一个客户端socket
socket=new Socket(host, port);
System.out.println("connect ok!");
}
public static void main(String[] args) throws Exception {
new TcpChatClient().say();
}
private void say() throws Exception {
//两个reader对象
//本地的system.in 的reader
BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));
//和服务器交互的writer【PrintWriter 的自动flush 功能】 这个ture参数非常重要 .
PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
//和服务器交互的reader
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String word;
String readLine;
while ((word=localReader.readLine())!=null){
//请求服务端来获取数据
writer.println(word);
//打印到控制台上
readLine = reader.readLine();
System.out.println(readLine);
//如果用户输入bye则退出循环
if (word.equals("bye")){
socket.close();
break;
}
}
}
}
网络Socket编程TCP协议例子的更多相关文章
- 网络Socket编程UDP协议例子
服务端代码 public class UDPChatServer { //通讯端口 private Integer port=8000; //数据报文的通讯通道对象 private DatagramC ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- Java:基于TCP协议网络socket编程(实现C/S通信)
目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...
- 网络编程TCP协议-聊天室
网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...
- UDP协议网络Socket编程(java实现C/S通信案例)
我的博客园:https://www.cnblogs.com/chenzhenhong/p/13825286.html 我的CSDN博客:https://blog.csdn.net/Charzous/a ...
- java多线程实现TCP网络Socket编程(C/S通信)
目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...
- 网络编程之tcp协议以及粘包问题
网络编程tcp协议与socket以及单例的补充 一.单例补充 实现单列的几种方式 #方式一:classmethod # class Singleton: # # __instance = None # ...
- 卫星网络中使用TCP协议的劣势(所以才有TCP优化版用来卫星通信啊,比如TCP-Peach和ADolar)
卫星网络中使用TCP协议的劣势 为了避免产生网络拥塞,原TCP协议综合采用了慢启动.拥塞避免.快速重传以及快速恢复等算法.但这些算法应用的前提是网络发生拥塞造成丢包,然而在误码率相对较高的卫星通信系统 ...
- 基于网络编程 TCP协议 及 socket 基本语法
socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...
随机推荐
- mysql学习之路_乱码问题
中文数据问题: 中文数据问题本质就说字符集问题, 计算机只识别二进制,人类识别符号:需要友谊个二进制与字符对应关系(字符集). 报错:服务器没有识别对应的四个字节. 服务器认为的数据是utf—8,一个 ...
- 解决Linux下IDEA无法使用ibus输入法的问题和tip乱码
一:可以先按网上的配置/etc/profile里的输入法的一些参数,我是先配置了这些参数的,但是输入法还是没用,后来一直没管它了,今天用了一些方式可以了但不敢保证不需要先配置那些参数: 二:情况:开启 ...
- Ajax传数据到servlet
//jsp代码 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" ...
- MyBatis(一)helloWorld程序
一.准备两个jar包,第一个:下载myBatis-3.3.1.jar,这里是在CSDN网站处下载的,因为官网打不开.第二个:mysql-connector-java-5.0.8-bin.jar,这个j ...
- (转)ASP.NET MVC3 Razor视图引擎-基础语法
转自:http://kb.cnblogs.com/page/96883/ I:ASP.NET MVC3在Visual Studio 2010中的变化 在VS2010中新建一个MVC3项目可以看出与以往 ...
- 用jquery制作一个二级导航下拉菜单
1使用$(function(){...})获取到想要作用的HTML元素. 2通过使用children()方法寻找子元素. 3通过使用show()方法来显示HTML元素. 4通过 ...
- js反选
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- Android-Lock-多线程通讯(生产者 消费者)&等待唤醒机制
此篇博客以 生产面包
- [转载]WIKI MVC模式
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). MVC模式最 ...
- Redis 5.0 安装
下载安装RedisServer mkdir –p /data/download && cd /data/download wget http://download.redis.io/r ...