1、服务器端程序

package Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class EchoServer { public static void main(String[] args) throws Exception { ServerSocket server =null;//定义ServerSocket对象
Socket client=null;//定义socket对象,表示客户端
PrintStream out=null;//声明打印流对象,以向客户端输出
BufferedReader buf = null;//用于接收客户端发来的信息
server = new ServerSocket();//此服务器在8888端口进行监听
boolean f=true;
while(f){
System.out.println("服务器运行,等待客户端连接");
client=server.accept();//接收客户端连接
buf = new BufferedReader(new InputStreamReader(client.getInputStream()));//得到客户端的输入信息
out= new PrintStream(client.getOutputStream());
//循环读取buf所有内容
boolean flag=true;
while(flag){
String str=buf.readLine();
if(str==null||"".equals(str)){
flag=false;//结束循环
}
else{
if("bye".equals(str)){
flag=false;
}
else
{
out.println("ECHO:"+str);//正常结束,向客户端回显信息
}
}
}
out.close();
client.close(); }
server.close();
} }

2、客户端程序

package Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException; public class EchoClient { public static void main(String[] args) throws Exception { Socket client=null;//声明Socket对象
client=new Socket("localhost",);//指定连接的主机和端口
BufferedReader buf=null;//接收服务器端发送回来的信息
PrintStream out=null;//输出流,向服务器端发送信息
BufferedReader input=null;
input=new BufferedReader(new InputStreamReader(System.in));//从键盘接收数据
out = new PrintStream(client.getOutputStream());//向服务器端发送信息
buf= new BufferedReader(new InputStreamReader(client.getInputStream()));//接收服务器端输入信息
boolean flag=true;
while(flag){
System.out.println("输入信息:");
String str=input.readLine();//从键盘接收数据
out.println(str); //向服务器端输入信息
if("bye".equals(str)){ //如果输入bye,结束操作
flag=false;
}
else{
String echo=buf.readLine();//接收ECHO信息
System.out.println(echo);//输出ECHO信息
}
}
client.close();
buf.close();
} }

效果如下:

此时,服务器每次只能有一个用户连接,属于单线程,要让多个用户连接服务器,要使用多线程...

服务器端与客户端TCP连接入门(二)的更多相关文章

  1. 服务器端与客户端TCP连接入门(一)

    Java中使用Socket(即套接字)完成TCP程序的开发 服务器端使用ServerSocket接收客户端的连接请求,每一个客户端都使用一个Socket对象表示 在服务器端每次运行时都要使用accep ...

  2. 服务器端与客户端TCP连接入门(三:多线程)

    对于服务器端来说,如果要加入多线程机制,则应该在每个用户连接之后启动一个新的线程 建立一个EchoThread类,此类专门用于处理多线程操作,此时的多线程使用Runnable接口实现 package ...

  3. 详解TCP四次挥手(断开TCP连接过程)

    在讲述TCP四次挥手,即断开TCP连接的过程之前,需要先介绍一下TCP协议的包结构. TCP协议包结构: 这里只对涉及到四次挥手过程的字段做解释 (1) 序号(Sequence number) 我们通 ...

  4. 详解TCP三次握手(建立TCP连接过程)

    在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构. 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数 ...

  5. 配置开发支持高并发TCP连接的Linux应用程序全攻略

    http://blog.chinaunix.net/uid-20733992-id-3447120.html http://blog.chinaunix.net/space.php?uid=16480 ...

  6. Linux配置支持高并发TCP连接(socket最大连接数)

    Linux配置支持高并发TCP连接(socket最大连接数) Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数 2011-08-09 15:20:58|  分类:LNMP&a ...

  7. 高并发TCP连接数目问题

    linux可通过五元组唯一确定一个链接:源IP,源端口,目的IP,目的端口,传输层协议.而一个端口不允许被两个及以上进程占用(一个进程可同时占用多个端口),据此是否可以推测一台linux服务器最多可以 ...

  8. TCP学习之二:客户端与服务端的连接

    主要参考张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html TcpClient是对Socket的封装 一个TcpClient ...

  9. TCP服务器端和客户端程序设计【转】

    本文转载自:http://blog.csdn.net/yueguanghaidao/article/details/7035248# 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.实验目的 ...

随机推荐

  1. java入门之从C#快速入门java

    可变参数: Void sum(int…list){}以“…”三个字为关键字 可变参数:以params为关键字 34 对异常的描述: java中,异常分为两种,运行时异常(也就是uncheckExcep ...

  2. 三层架构下的EntityFramework codefirst

    好久没写博客了,今天研究了EF框架的CodeFirst模式,从字面意思可以看出,代码优先.所谓代码优先,与以往的添加ado.net不同,主要是编写代码生成数据库和数据表,生成数据实体映射.个人感觉这种 ...

  3. Application.DoEvents():概念

    When you run a Windows Form, it creates the new form, which then waits for events to handle. Each ti ...

  4. PHPwind高级伪静态规则及方法

    phpwind iis下伪静态规则[ISAPI_Rewrite]RewriteRule ^(.*)/(.*)-htm-(.*)-(.*)\.html$ $1/$2\.php\?$3=$4Rewrite ...

  5. Linux C Programing - Arguments(2)

    #include <iostream> #include <stdlib.h> #include <stdio.h> //printf #include <u ...

  6. Android LayoutParams简介

    LayoutParams是子控件控制自己在父控件中布局的一个类. 不同布局都有相对的LayoutParams,最简单的LinearLayout.LayoutParams类可以设置布局的宽高. 我在写一 ...

  7. 关于ORACLE隐式转换后性能问题

    SELECT TM.MONEY_CODE FROM T_CONTRACT_MASTER T,T_MONEY TM WHERE T.MONEY_ID = TM.MONEY_ID AND T.POLICY ...

  8. draggable datagrid columns

    $.extend($.fn.datagrid.methods,{ columnMoving: function(jq){ return jq.each(function(){ var target = ...

  9. kibana安装与基础用法

    来自官网,版本为4.5 下载rpm包并安装 wget -c https://download.elastic.co/kibana/kibana/kibana-4.5.4-1.x86_64.rpm rp ...

  10. CentOS7 运行级别

    linux运行的级别7个级别运行级别的查看使用 runlevelrunlevelN 3 //运行在3级别,可以理解成命令行级别级别之间的切换需要使用init x 0 //关机3 //多用户的命令行级别 ...