java socket 如何实现客户端和服务器端不停地自由发送信息?

bear234 2013-07-31 04:48:47
socket通信的一些基本东西我都知道
比如我已经可以实现从客户端发送一条信息给服务器端然后服务器端在接收到客户端的信息后再返回给客户端一条确认信息

但这发送一次信息后就结束了

我想让客户端和服务器端可以来回互发信息 就像qq两个人聊天那样
怎么实现?


谢谢了
...全文
19882 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
shshiehfoe 2014-12-19
  • 打赏
  • 举报
回复
DWORD WINAPI FunThread(LPVOID); while(TRUE) { char data[11]; //收发缓冲区 int ReciveBytes; //接收字节的个数 if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR) //这里阻断程序,知道缓冲区内有可读数据才返回 { //套接字错误 break; } if(ret> 0) { if(FD_ISSET(client,&fdread))//c中是否属于fdread集合 { do//循环读取,每次接收100个字符,直到把缓冲区中全部取完 { ReciveBytes=recv(client,data,100,0); if(ReciveBytes==SOCKET_ERROR) { //SOCKET错误 break; } data[ReciveBytes]=0;//加上结束符 我这里感觉遇到了相同的问题,只能一个回一个达,无法实现自由通信 求帮帮忙吧
呵呵兽 2013-08-02
  • 打赏
  • 举报
回复
package com.softeem.java1307se.net.many2many;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;

/**
 * 发送线程
 * 
 *
 */
public class M2MSend extends Thread {
	
	//用户集合
	private ArrayList<Socket> list = M2MServer.getList();
	//当前用户
	private Socket s;
	
	public M2MSend(Socket s){
		this.s = s;
	}
	
	public void run(){
		
		//获取该用户 IP
		String ip = s.getInetAddress().getHostAddress();
		
		try {
			
			//读取用户信息
			BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
			
			//不断的读取写出数据
			while(true){
				
				//接收数据
				String info = null;
			
				//如果读取信息不为空
				if((info=reader.readLine()) != null){
					
					//遍历所有的在线用户,并且把信息发送过去
					for(Socket ss : list){
						
						//获取对象的输出流
						PrintWriter pw;
						pw = new PrintWriter(ss.getOutputStream());
						//写入信息
						pw.println(ip + " 说: " + info);
						pw.flush();
						
					}
					
				}
			}
			
		} catch (IOException e1) {
			//用户下线
			list.remove(s);
			System.err.println(ip + " 已下线 , 当前在线人数为: " + list.size() + " 人 !");
		}
		
		
	}

}
呵呵獸 2013-08-02
  • 打赏
  • 举报
回复
package com.softeem.java1307se.net.many2many;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * 接收信息
 * 
 *
 */
public class M2MReceive extends Thread {
	
	private Socket s;
	
	public M2MReceive(Socket s){
		this.s = s;
	}
	
	public void run(){
		
		try {
			
			//构建输入流
			BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
			
			//不断的接收信息
			while(true){
				
				String info = null;
				
				//接收信息
				if((info=br.readLine()) != null){
					System.out.println(info);
				}
				
			}
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	
}
呵呵獸 2013-08-02
  • 打赏
  • 举报
回复
package com.softeem.java1307se.net.many2many;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

/**
 * 多对多 服务器
 * 
 *
 */
public class M2MServer {
	
	//用户集合
	private static ArrayList<Socket> list = new ArrayList<Socket>();
	
	public static void main(String[] args) {
		
		//上线用户
		Socket s = null;
		
		//用户 
		String ip = null;
		
		try {
			
			//构建服务器对象
			ServerSocket ss = new ServerSocket(1234);
			
			//构建 用户集合
			list = new ArrayList<Socket>();
			
			System.out.println("服务器准备就绪 ...");
			
			//循环监听
			while(true){
				
				//上线用户
				s = ss.accept();
				
				//上线的人都添加到 集合中
				list.add(s);
				
				//获取 Socket IP
				ip = s.getInetAddress().getHostAddress();
				System.err.println( ip + " 用户上线了 , 当前在线用户为: " + list.size() + "人 !" );
				
				//构建 发送信息线程
				M2MSend send = new M2MSend(s);
				send.start();
			
			}
			
		} catch (IOException e) {
			//用户下线
			list.remove(s);
			System.err.println(ip + " 已下线 , 当前在线人数为: " + list.size() + " 人 !");
		}
		
	}

	public static ArrayList<Socket> getList() {
		return list;
	}

	public static void setList(ArrayList<Socket> list) {
		M2MServer.list = list;
	}
	
	

}
呵呵獸 2013-08-02
  • 打赏
  • 举报
回复
package com.softeem.java1307se.net.many2many;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 多对多客户端
 * 
 *
 */
public class M2MClient {
	
	public static void main(String[] args) {
		
		try {
			
			//构建客户端对象
			Socket s = new Socket("localhost",1234);
			
			//先从键盘接收信息
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			//写入到 Socket 中
			PrintWriter pw = new PrintWriter(s.getOutputStream());
			
			//启动线程
			M2MReceive receive = new M2MReceive(s);
			receive.start();
			
			while(true){
				
				//用户输入信息
				String info = null;
				
				if((info=br.readLine()) != null){
					
					//写出
					pw.println(info);
					pw.flush();
				}
				
			}
			
		
			
			
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
}
bear234 2013-08-01
  • 打赏
  • 举报
回复
引用 13 楼 u010863631 的回复:
按照你说的还是很容易实现的。建议用下udp协议试试。 两端分别建立一个等待对方发送消息的线程,和一个发送给对方消息的线程。这样你就可以想输入多少就输入多少。 如果想看代码的话,你可以下载java实现的简洁qq功能,里面肯定是这个样子的代码。
其实我这两天就是在学用udp和tcp实现互相传输数据的 我现在的代码还正好就是udp 既然现在大家意见一致了 都用多线程 那我就继续了 谢谢哈
「已注销」 2013-08-01
  • 打赏
  • 举报
回复
按照你说的还是很容易实现的。建议用下udp协议试试。 两端分别建立一个等待对方发送消息的线程,和一个发送给对方消息的线程。这样你就可以想输入多少就输入多少。 如果想看代码的话,你可以下载java实现的简洁qq功能,里面肯定是这个样子的代码。
bear234 2013-08-01
  • 打赏
  • 举报
回复
引用 10 楼 u010863631 的回复:
还是没太弄明白楼主具体要的是什么效果。要客户端和服务端自己通信?客户端自动给服务端发信息,服务端返回,然后客户端继续自己发? while(true)足够可以实现了的。服务端等待本身就用while(true)就行,客户端在接到服务端信息后也可以做一样处理的。 如果可以,还是把你现在不能自己通信的代码贴出来,大家一起改改。这样简洁些。
我现在可以实现这这样: 客户端发送一条信息 服务器端收到 服务器端返回一个信息给客户端 我也加while(true)了 所以现在实现了上面这三个过程的不断重复 如果我要做可以彼此互相发信息的 正如上面一位朋友所说 就部分客户端和服务器端了 这儿我懂 但这样的话,我只能实现“必须 你一句我一句” 而 不能我连续说三句话而你一句话也不说但你收到我这三句话了------就像两个人在qq上那样随意聊天 因为在while(true)里 有 System.in 这个步骤 所以必须输入东西才能继续往下 我现在有两个想法: 要么多线程(上面几位朋友都这么说了) 要么监听键盘输入,即 if(键盘有输入) { System.in } c或者c++的话 有kbhit 这个函数可以监听键盘 java的话要监听键盘事件 这个我还不太了解 也不知道可行不可行
茫茫大海 2013-08-01
  • 打赏
  • 举报
回复
肯定要用到多线程的!
「已注销」 2013-08-01
  • 打赏
  • 举报
回复
还是没太弄明白楼主具体要的是什么效果。要客户端和服务端自己通信?客户端自动给服务端发信息,服务端返回,然后客户端继续自己发? while(true)足够可以实现了的。服务端等待本身就用while(true)就行,客户端在接到服务端信息后也可以做一样处理的。 如果可以,还是把你现在不能自己通信的代码贴出来,大家一起改改。这样简洁些。
想喝咖啡的貓 2013-08-01
  • 打赏
  • 举报
回复
建立个长连接发去呗。 telnet、ssh、ftp都是长连接。
赏金--猎人 2013-08-01
  • 打赏
  • 举报
回复
引用 6 楼 bear234 的回复:
[quote=引用 3 楼 szx_zsx 的回复:] 同意1楼,加个while(true){}
是不是要用到多线程? 我也试着加过while(true) 但是 循环体里面是先等待输入 然后 发送输入的内容 然后显示从另一端接收到的东西 这样的话每次都必须先输入个什么循环体才能走下去 不然会卡在等待输入 这就成了必须 你一句 我一句 了[/quote] 是用多线程,这种情况下就不分客户端和服务端了,客户端和服务端都包含 监听端口,接收消息和发送消息
yanxing2012 2013-08-01
  • 打赏
  • 举报
回复
引用 16 楼 bear234 的回复:
[quote=引用 15 楼 yanxing2012 的回复:] [quote=引用 7 楼 Bumpking 的回复:] nio 建立socket连接之后可以做两个线程一个负责发送 一个负责接收吧?
+1 如果用TCP ,可以客户端既是服务器又是客户端,两端都有socket和serverSocket,一个发送,一个接收,不过用UDP会省事些。。。[/quote] 是不是这样: class Receive implements Runnable{} class Send implements Runnable{} class Client { Receive r = new Receive(); Send s = new Send(); new Thread(r).start(); new Thread(s).start(); } 同上再做个Client类 然后这两个client就可以互发了?[/quote] 这样可以。。。
bear234 2013-08-01
  • 打赏
  • 举报
回复
引用 15 楼 yanxing2012 的回复:
[quote=引用 7 楼 Bumpking 的回复:] nio 建立socket连接之后可以做两个线程一个负责发送 一个负责接收吧?
+1 如果用TCP ,可以客户端既是服务器又是客户端,两端都有socket和serverSocket,一个发送,一个接收,不过用UDP会省事些。。。[/quote] 是不是这样: class Receive implements Runnable{} class Send implements Runnable{} class Client { Receive r = new Receive(); Send s = new Send(); new Thread(r).start(); new Thread(s).start(); } 同上再做个Client类 然后这两个client就可以互发了?
yanxing2012 2013-08-01
  • 打赏
  • 举报
回复
引用 7 楼 Bumpking 的回复:
nio 建立socket连接之后可以做两个线程一个负责发送 一个负责接收吧?
+1 如果用TCP ,可以客户端既是服务器又是客户端,两端都有socket和serverSocket,一个发送,一个接收,不过用UDP会省事些。。。
Bumpking 2013-07-31
  • 打赏
  • 举报
回复
nio 建立socket连接之后可以做两个线程一个负责发送 一个负责接收吧?
bear234 2013-07-31
  • 打赏
  • 举报
回复
引用 3 楼 szx_zsx 的回复:
同意1楼,加个while(true){}
是不是要用到多线程? 我也试着加过while(true) 但是 循环体里面是先等待输入 然后 发送输入的内容 然后显示从另一端接收到的东西 这样的话每次都必须先输入个什么循环体才能走下去 不然会卡在等待输入 这就成了必须 你一句 我一句 了
bear234 2013-07-31
  • 打赏
  • 举报
回复
引用 2 楼 AA5279AA 的回复:
你给一个单线程的我帮你改吧。。 自己写一个太累
只有一个客户端 一个服务器端 也需要多线程吗?
bear234 2013-07-31
  • 打赏
  • 举报
回复
只有一个客户端 一个服务器端 也需要多线程吗?
赏金--猎人 2013-07-31
  • 打赏
  • 举报
回复
同意1楼,加个while(true){}
加载更多回复(2)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧