Java中利用Socket实现客户端聊天程序

Socket是网络编程中最基本的通信接口,常用的网络辅助类,比如URL等之类,其底层还是基于Socket来实现的。

而Socket,形象来说,就是连接通信的两端,比如这样 S<==>S,中间的通道就是网络了,而简单地利用Socket,我们就可以来实现一个简单的聊天功能

具体效果看下图:

这只是在本地中试用的效果,如果加上UI界面,其实就可以做成一个聊天的小应用了。

1. Server 端主要是利用ServerSocket的accept方法来等待客户端的连接,如果客户一直没有连接,则会在这里等待,直到客户端请求到来。

而客户端就是一个Socket,当客户端请求到来的时候,accept会返回一个Socket对象, 这就是S<==>S中的左边那个S了,可以利用其InputStream和OutputStream来进行读写了,读就是接收信息,而写就是回复信息。

 代码如下 复制代码

public class Server {

public static void main(String[] args) {

try {

ServerSocket server = new ServerSocket(9999);

Helper.println("Server started, waiting for message.");

Socket client = server.accept();

PrintWriter pw = null;

while (true) {

BufferedReader br = new BufferedReader(new InputStreamReader(

client.getInputStream()));

String content = br.readLine();

if (content.equals("end")) {

server.close();

br.close();

if (pw != null) {

pw.close();

}

break;

}

Helper.println(content);

Helper.print("Server:");

pw = new PrintWriter(client.getOutputStream(), true);

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

String output = "Server : " + in.readLine();

pw.println(output);

pw.flush();

}

Helper.println("Client left! Server Closed.");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}
 

2. Client端就是一个Socket,并定义一个连接的地址和端口,地址表明是网络中哪一台主机,而端口则表明了是主机中的那个应用程序,很显然就是上面Server这个应用,因为其定义了其等待监听的端口就是9999.当创建了一个Socket对象,并指定了地址和端口的时候,其实就已经发送了一个请求去对应的Server,请求连接,而如果连接成功,就可以继续下去,不然直接抛出异常。当然,这里连接成功,必须是Server先在监听了。[java] view plaincopy

 代码如下 复制代码

public class Client {

public static void main(String[] args) {

try {

Socket client = new Socket("127.0.0.1", 9999);

PrintWriter pw = null;

InputStreamReader isr = null;

Helper.println("Client started, ready to write content.");

String input = "";

while (true) {

Helper.print("Client : ");

InputStream is = System.in;

input = new BufferedReader(new InputStreamReader(is))

.readLine();

pw = new PrintWriter(client.getOutputStream(), true);

pw.println("Client:" + input);

if (input.equals("end")) {

client.close();

is.close();

pw.close();

if (isr != null) {

isr.close();

}

break;

}

isr = new InputStreamReader(client.getInputStream());

Helper.println(new BufferedReader(isr)。readLine());

}

Helper.println("Client stopped!");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

ps:java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。
. Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
. getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
. getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

时间: 2024-07-31 10:51:59

Java中利用Socket实现客户端聊天程序的相关文章

Java中利用JMF编写摄像头拍照程序

程序 首先到SUN下载最新的JMF,然后安装.http://java.sun.com/products/java-media/jmf/index.jsp 然后,说一下需求 1. 用摄像头拍照 2. 在文本框输入文件名 3. 按下拍照按钮,获取摄像头内的图像 4. 在拍下的照片上有一红框截取固定大小的照片. 5. 保存为本地图像为jpg格式,不得压缩画质 技术关键,相信也是大家最感兴趣的部分也就是如何让一个摄像头工作,并拍下一张照片了. 利用JMF,代码很简单: //利用这三个类分别获取摄像头驱动

服务器-java中把Socket.accept放入多线程中 如果一个客户端连入 那么会接入哪一个线程中呢

问题描述 java中把Socket.accept放入多线程中 如果一个客户端连入 那么会接入哪一个线程中呢 如题 自己测试出来是连接不到 不明白 ................... .................... 解决方案 linux C中的accept函数它的其中一个参数struct sockaddr是一个结构体,该结构体中的一个字段记录了连接上来的客户端的IP地址和端口号等信息, 你只需要访问该结构体中的这个字段就好了 accept( SOCKET s, struct sock

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序.  餐前甜点  Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对

教你轻松读懂Java中的Socket编程

餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个对象进行一次或多次的读取或写入操作.Read操作用来从IO操作对象读取数据,并将数据传递给用户进程.Write操作用来将用户进程中的数据传递(写入)到IO操作对象. 当所有的Read和Write操作结束之后,用户进程需要调用Close来通知系统其完成对

socket多人聊天程序C语言版(二)_C 语言

socket多人聊天程序C语言版(一)地址: http://www.jb51.net/article/94938.htm 1V1实现了,1V多也就容易了.不过相对于1V1的程序,我经过大改,采用链表来动态管理.这样效率真的提升不少,至少CPU使用率稳稳的在20以下,不会飙到100了.用C语言写这个还是挺费时间的,因为什么功能函数都要自己写,不像C++有STL库可以用,MFC写就更简单了,接下来我还会更新MFC版本的多人聊天程序.好了,废话少说,进入主题. 这个程序要解决的问题如下: 1.CPU使

java中利用反射调用另一类的private方法的简单实例_java

我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下:  import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectDemo

第三方dll文件-Java中利用jawin调用dll文件,invoke的参数问题

问题描述 Java中利用jawin调用dll文件,invoke的参数问题 各位大神: dll中的被调用方法如下: long WINAPI AutoOpenComPort(long* Port, unsigned char *ComAdr, unsigned char Baud,long *FrmHandle); 其中: Port:输出变量, ComAdr:输入/输出变量 Baud:输入变量 FrmHandle:输出变量 请问它的 msgBox.invoke(instructions, stack

关于java中applet问题,我的程序无法在html中显示出来,请问哪出问题了。

问题描述 关于java中applet问题,我的程序无法在html中显示出来,请问哪出问题了. 该程序是要画一个余弦图形. import java.applet.*; import java.awt.*; public class test3 extends Applet { public void start() { int x,y; Graphics g=getGraphics(); for(x=0;x<=750;x++) { g.drawString(".",x,200);

Java中利用散列表实现股票行情的查询(转)

Java中利用散列表实现股票行情的查询 建设银行云南省保山地区分行 杨绍方 ---- 在java中,提供了一个散列表类Hashtable,利用该类,我们可以按照特定的方式来存储数据,从而达到快速检索的目的.本文以查询股票的收盘数据为例,详细地说明java中散列表的使用方法.一.散列表的原理 ---- 散列表,又称为哈希表,是线性表中一种重要的存储方式和检索方法.在散列表中,可以对节点进行快速检索.散列表算法的基本思想是:由结点的关键码值决定结点的存储地址,即以关键码值k为自变量,通过一定的函数关