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协议例子的更多相关文章

  1. 网络Socket编程UDP协议例子

    服务端代码 public class UDPChatServer { //通讯端口 private Integer port=8000; //数据报文的通讯通道对象 private DatagramC ...

  2. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  3. Java:基于TCP协议网络socket编程(实现C/S通信)

    目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...

  4. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

  5. UDP协议网络Socket编程(java实现C/S通信案例)

    我的博客园:https://www.cnblogs.com/chenzhenhong/p/13825286.html 我的CSDN博客:https://blog.csdn.net/Charzous/a ...

  6. java多线程实现TCP网络Socket编程(C/S通信)

    目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...

  7. 网络编程之tcp协议以及粘包问题

    网络编程tcp协议与socket以及单例的补充 一.单例补充 实现单列的几种方式 #方式一:classmethod # class Singleton: # # __instance = None # ...

  8. 卫星网络中使用TCP协议的劣势(所以才有TCP优化版用来卫星通信啊,比如TCP-Peach和ADolar)

    卫星网络中使用TCP协议的劣势 为了避免产生网络拥塞,原TCP协议综合采用了慢启动.拥塞避免.快速重传以及快速恢复等算法.但这些算法应用的前提是网络发生拥塞造成丢包,然而在误码率相对较高的卫星通信系统 ...

  9. 基于网络编程 TCP协议 及 socket 基本语法

    socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...

随机推荐

  1. c++关键字static的作用

    1.隐藏 当同时编译多个源文件(.cpp)时,在某一个源文件中用static修饰的全局变量或函数,对其他源文件是隐藏的 //1.cpp ; void fun() { cout << < ...

  2. bind函数(c++11)

    1.概念 1)c++11使用bind()函数可以向函数传递参数,一般调用形式为: 返回的newCallable是一个可调用的对象,callable是需要传参的函数,arg_list是参数列表 2)bi ...

  3. Java之spilt()函数,trim()函数

    一.单个符号作为分隔符  package com.regix; public class FuncSpilt { public static void main(String[] args) { // ...

  4. 图解TCP/IP(一)

    IP(Internet Protocol) IP/ICMP -数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递.而一旦跨越多种数据链路,就需要借助网络层. -配备IP的设备,但是不进行路 ...

  5. PHP函数gmstrftime()将秒数转换成天时分秒

    http://yangjunwei.com/a/930.html PHP函数gmstrftime()将秒数转换成天时分秒   一个应用场景需要用到倒计时的时分秒,比如新浪微博授权有效期剩余: 7天16 ...

  6. 机器学习P7

    优化问题: https://www.cnblogs.com/liaohuiqiang/p/7805954.html KKT条件就是把高数里面求不等式约束条件问题的分类方法写成两个条件.

  7. HDU 1404 Digital Deletions (暴力博弈)

    题意:给定一个数字串,最长是6,然后有两种操作. 第一种是,把该串中的一个数字换成一个比该数字小的数,比如 5 可以换成 0,1,2,3,4.   e.g. 12345 --> 12341 第二 ...

  8. Mathtype批量修改公式

    (1)将模板中的公式直接打开 (2)将需要修改好的公式复制黏贴到模板中 (3)再复制黏贴出,即可 PS: (1)统一设置公式格式 (2)统一设置公式大小

  9. Java学习第1天:序言,基础及配置tomcat

    所谓是福不是祸,是祸躲不过,到底还是回到java的阵地上来.既然它这么热,那就学学它,现在这件事已经提上议事日程,也已经开始. 今天做的事: 泛泛的翻了几本书,敲了一些练习代码,比如字符串操作,接口等 ...

  10. leaflet入门(三)使用GeoJSON创建矢量图形

    # 点对象: function g(feature, layer) { // does this feature have a property named popupContent? if (fea ...