A. java怎么通过socket实现服务端与客户端交互
1、服务端监听一个端口,其它客户端都通过这个端口和服务端进行通信。
2、每个客户端连接上来,服务端给其一个标识ID。然后向其它所有客户端广播一下有新客户端接入,ID多少。
3、客户端要向客户端发送消息,可以以消息包的形式发送,就是把目的客户端的标识和发送的内容组成一个数据包发往服务器,服务器读取就知道要向哪 个客户端发送数据,然后把内容往目的客户端通道发送
B. java socket服务器怎么给客户端发信息
服务器端和客户端都是通过SOCKET来进行通信的,首先产生一个
socket实例,通过这个实例,服务器端调用accept这个方法接收来自客户端发送的信息.但是在产生socket实例的时候必须初始化一个端口.用来负责接受客户端的请求!
客户端要给服务器发送消息也必须产生一个socket实例,初始化的时候必须指定服务器的IP地址,并且指定服务接收的端口号,这样客户端才能找到服务器要接收的地方,找到地方就可以发送过去了。和你写信一样。找到地址
BufferedReader
in
=
new
BufferedReader(new
InputStreamReader(socket.getInputStream()));
PrintWriter
out
=
new
PrintWriter(socket.getOutputStream());
BufferedReader
wt
=
new
BufferedReader(new
InputStreamReader(System.in));
这个只是用来获取一个从键盘的一个流.传送给服务器端的数据都是通过流来表示的。意思是是键盘输入的一个字节转化成字符流.并输出或者写入!
C. 用java socket实现一个服务器对多个客户端的文件传输
通过socket可以用如下方式进行。
1.启动服务端代码。
2.启动客户端自动连接服务端。
3.服务端上传文件,保存文件和路径。
4.将路径发送给连接服务端的客户端。
D. java socket 服务器如何实现主动发送然后接受处理返回信息
已经有连接了那就好办了,直接用连接发送数据,客户端根据指令类别进行响应就可以了。
最好将数据 放在一个类里面 包括 数据,指令 等信息。
比如 发一个 1234,查找用户名指令
你先看指令是什么 然后根据数据1234进行用户名查找
E. java中soket一个服务器可以向多个客服端发送信息,怎么实现!
1步.首先主服务器在阻塞等待客户端连接
2步.当有连接来的时候就分配给子服务器来和这个socket会话
3步.保存每个客户端的socket对象,比如存在一个链表onlineList<Socket>中,
///////////////////////////////////
主服务器类
onlineList= Collections.synchronizedList(new LinkedList<Socket>());//创建一个用于存放在线用户的socket对象的表
while()
{
Socket client_socket = server.accept(); //1步
subServer new_sub = new subServer(client_socket);//2步
onlineList.add(client_socket);//3步
}
然后当要群发就可以在主服务器执行下面的方法
///////////////////////////
主服务器类的群发方法
BufferedWriter writer;
String content = "要发送的内容";
for(Socket target: onlineList) //从列表中找出
{
writer = new BufferedWriter(new OutputStreamWriter(target.getOutputStream())); //循环对每个socket对象使用getOutputStream
writer.write(content); //发送出去
writer.flush(); //清空刷缓冲区
}
F. 用Java socket 实现客户端与服务器之间的数据的发送与接受。。。双向的
下面是一个简单的通讯实例,进行Server和Client之间的文件传输。。如果是简单的文本传输的话简化掉文本操作的内容即可。。
1.服务器端
package sterning;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
int port = 8821;
void start() {
Socket s = null;
try {
ServerSocket ss = new ServerSocket(port);
while (true) {
// 选择进行传输的文件
String filePath = "D:\\lib.rar";
File fi = new File(filePath);
System.out.println("文件长度:" + (int) fi.length());
// public Socket accept() throws
// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
s = ss.accept();
System.out.println("建立socket链接");
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
dis.readByte();
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(s.getOutputStream());
//将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
while (true) {
int read = 0;
if (fis != null) {
read = fis.read(buf);
}
if (read == -1) {
break;
}
ps.write(buf, 0, read);
}
ps.flush();
// 注意关闭socket链接哦,不然客户端会等待server的数据过来,
// 直到socket超时,导致数据不完整。
fis.close();
s.close();
System.out.println("文件传输完成");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
new ServerTest().start();
}
}
2.socket的Util辅助类
package sterning;
import java.net.*;
import java.io.*;
public class ClientSocket {
private String ip;
private int port;
private Socket socket = null;
DataOutputStream out = null;
DataInputStream getMessageStream = null;
public ClientSocket(String ip, int port) {
this.ip = ip;
this.port = port;
}
/** *//**
* 创建socket连接
*
* @throws Exception
* exception
*/
public void CreateConnection() throws Exception {
try {
socket = new Socket(ip, port);
} catch (Exception e) {
e.printStackTrace();
if (socket != null)
socket.close();
throw e;
} finally {
}
}
public void sendMessage(String sendMessage) throws Exception {
try {
out = new DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
return;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
return;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} else {
out.writeUTF(sendMessage);
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
if (out != null)
out.close();
throw e;
} finally {
}
}
public DataInputStream getMessageStream() throws Exception {
try {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
return getMessageStream;
} catch (Exception e) {
e.printStackTrace();
if (getMessageStream != null)
getMessageStream.close();
throw e;
} finally {
}
}
public void shutDownConnection() {
try {
if (out != null)
out.close();
if (getMessageStream != null)
getMessageStream.close();
if (socket != null)
socket.close();
} catch (Exception e) {
}
}
}
3.客户端
package sterning;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class ClientTest {
private ClientSocket cs = null;
private String ip = "localhost";// 设置成服务器IP
private int port = 8821;
private String sendMessage = "Windwos";
public ClientTest() {
try {
if (createConnection()) {
sendMessage();
getMessage();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private boolean createConnection() {
cs = new ClientSocket(ip, port);
try {
cs.CreateConnection();
System.out.print("连接服务器成功!" + "\n");
return true;
} catch (Exception e) {
System.out.print("连接服务器失败!" + "\n");
return false;
}
}
private void sendMessage() {
if (cs == null)
return;
try {
cs.sendMessage(sendMessage);
} catch (Exception e) {
System.out.print("发送消息失败!" + "\n");
}
}
private void getMessage() {
if (cs == null)
return;
DataInputStream inputStream = null;
try {
inputStream = cs.getMessageStream();
} catch (Exception e) {
System.out.print("接收消息缓存错误\n");
return;
}
try {
//本地保存路径,文件名会自动从服务器端继承而来。
String savePath = "E:\\";
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int passedlen = 0;
long len=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(newBufferedOutputStream(new FileOutputStream(savePath))));
len = inputStream.readLong();
System.out.println("文件的长度为:" + len + "\n");
System.out.println("开始接收文件!" + "\n");
while (true) {
int read = 0;
if (inputStream != null) {
read = inputStream.read(buf);
}
passedlen += read;
if (read == -1) {
break;
}
//下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比
System.out.println("文件接收了" + (passedlen * 100/ len) + "%\n");
fileOut.write(buf, 0, read);
}
System.out.println("接收完成,文件存为" + savePath + "\n");
fileOut.close();
} catch (Exception e) {
System.out.println("接收消息错误" + "\n");
return;
}
}
public static void main(String arg[]) {
new ClientTest();
}
}
G. 使用java socket怎么能够实现将一个客户端发送到服务端的消息转发到另一个客户端
用一个集合记住所有客户的Socket,收到数据包,就根据收发要求,转发
H. java socket服务器发送信息给指定的客户端,在线等
是tcp还是udp啊?socket连接可以指定ip和端口啊,所以服务端即使有N个socket连接都不怕,知道端口就行了
I. java socket服务器怎么给所有客户端发系统消息
将链接过来的socket保存,需要广播时遍历发送:
在server主类中定义private static List<Socket> sos=new ArrayList<Socket>();并添加getset方法,在server线程类的构造方法中:
public ServerThread(Socket s,List<ShipMes> ships){
this.s=s;
this.ships=ships;
ss.setSos(s);
}
需要广播时:
List<Socket> sos=ss.getSos();
Iterator<Socket> i=sos.iterator();
Socket temps=null;
while(i.hasNext()){
temps=(Socket)i.next();
os=new PrintWriter(temps.getOutputStream());
os.println(mess);
os.flush();
}
J. 关于 java socket的消息推送问题
使用线程池会比较好。方便管理。你也要对链接的线程做一个限制,无限的链接创建线程会耗尽内存的。比如:
{
;
;
publicNetworkService(intport,intpoolSize)
throwsIOException{
serverSocket=newServerSocket(port);
pool=Executors.newFixedThreadPool(poolSize);
}
publicvoidrun(){//runtheservice
try{
for(;;){
pool.execute(newHandler(serverSocket.accept()));
}
}catch(IOExceptionex){
pool.shutdown();
}
}
}
{
privatefinalSocketsocket;
Handler(Socketsocket){this.socket=socket;}
publicvoidrun(){
//readandservicerequestonsocket
}
}
在没有消息的时候,线程要处于wait状态,当有消息的时候,用notify来激活。