最近从一篇博客中看到了Socket的介绍,是阿蜜果姐姐的博文:http://www.blogjava.net/amigoxie/archive/2007/02/11/99331.html,学习了下。

其实之前一直没有接触过Socket这方面的东西,工作中也没有用到,不过Socket是蛮重要的一个模块还是要研究下。

根据阿蜜果的文章,拿下来修改了一下,发现很好用,修改了一下就是一个可以交互对话的程序了

package com.socket;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket; /**
* Socket的Server举例
*
* @author Jason
* @since 2013/08/11
*/
public class SocketServer {
ServerSocket serverSocket = null;
Socket socket = null;
DataInputStream inStream = null;
DataOutputStream outStream = null; public static void main(String[] args) {
SocketServer socketServer = new SocketServer();
socketServer.waitForClient();
} public SocketServer() {
try {
serverSocket = new ServerSocket(6600);
} catch (Exception e) {
e.printStackTrace();
}
} void waitForClient() {
try {
socket = serverSocket.accept();
inStream = new DataInputStream(socket.getInputStream());
outStream = new DataOutputStream(socket.getOutputStream());
outStream.writeUTF("let's start our chart!");
socket.setSoTimeout(60000);
acceptAndSendData();
} catch (Exception e) {
e.printStackTrace();
}
} void acceptAndSendData() {
while (true) {
try {
String acceptStr = inStream.readUTF();
System.out.println("Server accept:" + acceptStr);
if (acceptStr.toLowerCase().contains("end"))
break;
System.out.println("I:");
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String sendStr = br.readLine(); if (sendStr.toLowerCase().contains("end"))
break;
outStream.writeUTF(sendStr);
} catch (Exception e) {
e.printStackTrace();
break;
}
}
}
}

下面是Client的代码

package com.socket;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket; /**
* Socket的Client举例
*
* @author Jason
* @since 2013/08/11
*/
public class SocketCliet { Socket socket = null; DataInputStream inStream = null; DataOutputStream outStream = null; public static void main(String[] args) {
SocketCliet socketCliet = new SocketCliet();
} public SocketCliet() {
try {
init();
waitData();
} catch (Exception e) {
e.printStackTrace();
}
} void init() throws Exception {
socket = new Socket("127.0.0.1", 6600);
inStream = new DataInputStream(socket.getInputStream());
outStream = new DataOutputStream(socket.getOutputStream());
socket.setSoTimeout(60000);
} void waitData() {
boolean flag = true;
while (flag) {
try {
String acceptStr = inStream.readUTF();
System.out.println("Client accept: " + acceptStr);
if (acceptStr.toLowerCase().contains("end")) {
System.out.println("End!");
break;
}
System.out.println("I:");
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String sendStr = br.readLine(); outStream.writeUTF(sendStr);
if (sendStr.toLowerCase().contains("end"))
break; } catch (Exception e) {
e.printStackTrace();
break;
}
}
}
}

先启动Server,再启动Client程序。Server会先发送“let's start our chart!”给Client,然后Client会将输入的聊天语句发送给Server,Server和Client就建立了一个简单的可以输入文字,看见对方的回应的聊天程序。

其中有需要注意的几点:1,socket.setSoTimeout(60000);这个时间是连接的超时时间,如果超过60秒还没有交互的话,连接就会被丢弃。

2,程序设定了,任何一方输入end之后就会中断连接。这个过程程序一定要控制是服务器端先告诉客户端我要中断,然后关掉连接;客户端接受到关闭的指示后再去关闭连接,否则就会出错,抛出Connect Reset的异常。

这个程序还可以改造,任何一个聊天的程序都不会是客户端去跟服务器聊天,一定是两个或者更多的客户端之间的交互,服务器应该是作为一个中间者。可以考虑在每一个连接建立的时候分配一个空间作为聊天的平台。

例如,A告诉服务器我要建立一个聊天的平台叫做ABLove,然后服务器端建立一个Map存起来,key就是ABLove;B向服务器发起一个连接,说我要进入ABLove的平台;

A说一句I love you!,服务器把这句话放进Map的存储中,B连接的服务器捕捉到Map里的值有变化,就把这句话发送给B,B说I love you too!,同样的方式将会转给A。

当然Map只是一种假定,完全可以用另外的数据结构设计来存储这些东西去实现。

Socket通信之Java学习(一)的更多相关文章

  1. java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)

    原文链接: http://www.cnblogs.com/kenkofox/archive/2010/04/25/1719649.html 代码: http://files.cnblogs.com/k ...

  2. 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)

    非常多刚開始学习的人对于java网络通信不太熟悉.对相关概念也不太明确,这里我们主要实现一下socket通信,socket通信在java中应用十分广泛.比如QQ和MSN等都是基于socket通信的,什 ...

  3. Java多线程技术:实现多用户服务端Socket通信

    目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...

  4. Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...

  5. Socket实现client和server端通信(Java)(转)

    转自: https://blog.csdn.net/yayun0516/article/details/50819147 https://www.jianshu.com/p/2d4f223f1462 ...

  6. 【Java】Java socket通信使用read,readline函数的阻塞问题

    Socket通信是Java网络编程中比较基础的部分,其原理其实就是源ip,源端口和目的ip,目的端口组成的套接字通信.其底层还设及到了TCP协议的通信. Java中的Socket通信可以通过客户端的S ...

  7. Socket通信代码(原理)

    1.运行环境:NetBeans IDE 6.0.1 2.说明:先运行服务器端,再运行客户端. 3.服务器端代码: 新建java类Test import java.net.*; import java. ...

  8. java学习小笔记(三.socket通信)【转】

    三,socket通信1.http://blog.csdn.net/kongxx/article/details/7288896这个人写的关于socket通信不错,循序渐进式的讲解,用代码示例说明,运用 ...

  9. android的NDK和java进行本地socket通信

    关于Android应用与Framework的socket通信,相信关心这个问题的朋友们已经看过<android使用socket使底层和framework通信>这篇文章,美中不足的是作者只贴 ...

随机推荐

  1. 编程算法 - 第一个仅仅出现一次的字符 代码(C)

    第一个仅仅出现一次的字符 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 在字符串中找出第一个仅仅出现一次的字符. 字符是char类型, 所以匹 ...

  2. PHP_零基础学php_2变量、预定义变量、预定义常量、表达式、运算符、程序控制流程

    1.变量 PHP中使用$后跟变量名表示一个变量,变量名区分大小写. 变量的数据类型 整数类型 浮点类型 字符串类型 布尔类型 数组类型 对象 <html> <head> < ...

  3. SQL2005性能分析一些细节功能你是否有用到?(三)

    原文:SQL2005性能分析一些细节功能你是否有用到?(三) 继上篇: SQL2005性能分析一些细节功能你是否有用到?(二) 第一: SET STATISTICS PROFILE ON 当我们比较查 ...

  4. Zepto

    移动开发流量省起来之Zepto 事情是这样的:最近开发的一个手机网站客户反应访问起来特别慢,刷了半天才能看到页面,然后问我们是不是网站出问题了.于是我赶紧找了各种手机测试一下,没有问题,首先排除程序错 ...

  5. Tomcat 80 端口被占,解决方案

    Windows 平台下Tomcat启动不起,显示 SEVERE: Failed to initialize end point associated with ProtocolHandler [&qu ...

  6. MVC5控制器、路由、返回类型、选择器、过滤器

    ASP.NET MVC5 学习笔记-1 控制器.路由.返回类型.选择器.过滤器   [TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序, ...

  7. 是男人就下100层【第四层】——Crazy贪吃蛇(1)

    贪吃蛇是一款非常经典的游戏,这些经典游戏给我们的童年添加了不少乐趣,今天開始我们来一步一步的在Android设备上实现一款贪吃蛇游戏,我也是第一次写这个游戏,有可能会写错,或者走弯路,可是终于希望能有 ...

  8. 基于科大讯飞语音云windows平台开发

    前记: 前段时间公司没事干,突发奇想想做一个语音识别系统,看起来应该非常easy的,但做起来却是各种问题,这个对电气毕业的我,却是挺为难的.谷姐已经离我们而去,感谢度娘,感谢CSDN各位大神,好歹也做 ...

  9. 图解IntelliJ IDEA v13应用服务器的运行配置

    初步了解IntelliJ IDEA v13应用服务器以后,接下来我们将继续设置应用服务器的运行配置. Artifacts是IDE在通过运行配置时部署的一个服务.Artifacts包括名称.类型.输出目 ...

  10. PHP:Cannot modify header information - headers already sent by错误的解决方案

    <?php ob_start();setcookie("username","test",time()+3600);echo "the user ...