有关socket事件诊听的问题(70分)

  • 主题发起人 主题发起人 cadwolf
  • 开始时间 开始时间
C

cadwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己要编一个局域网内聊天程序,采用socket
请问在ServerSocket中如何诊听到发过来的话,在什么事件中进行处理。如何使程序随时
接受信息?当客户发出话的时候,如何写触发消息?
 
Occurs when the server socket should read information from a client socket.
property OnClientRead: TSocketNotifyEvent;
Description
Write an OnClientWrite event handler to write to the socket connection. If the ServerType property is stThreadBlocking, use a TWinSocketStream object to prevent problems that arise while writing from causing the execution thread to hang indefinitely. Otherwise, use the methods of the Socket parameter to perform the actual writing.
Note: If ServerType is stThreadBlocking, make sure that all code in an OnClientRead event handler is thread-safe. Use the GetClientThread method of the Sender parameter to access thread-specific information.
 
给你我以前两个函数,是阻塞性函数,我现在是使用一个读进程类、一个写进程类进行Socket操作,
这两个函数不支持中文,因为是 utf-8 编码,你可以直接使用 byte[] 进行 utf-16be 编码进行中
文支持
/** Writing Text to a Socket */
public final static void writeSocket(Socket sk, StringBuffer sb)
{
sb.append(sFinished);
writeSocket(sk, sb.toString());
}
/** Writing Text to a Socket */
public synchronized final static void writeSocket(Socket socket, String str)
{
try
{
OutputStream os = socket.getOutputStream();
DataOutputStream ostream = new DataOutputStream(os);
ostream.writeUTF(str);
ostream.flush();
}
catch (IOException e)
{
throw new RuntimeException("Write Socket Exception.");
}
}
/** Reading Text from a Socket */
public synchronized final static String readSocket(Socket socket)
{
try
{
InputStream is = socket.getInputStream();
DataInputStream istream = new DataInputStream(is);
return istream.readUTF();
}
catch (IOException e)
{}
return null;
}

/** Reading Text from a Socket */
/*
public synchronized final static String readSocket(Socket socket)
{
int bufferSize = 40960;
int resultSize = 0;
int readSize = 0;
char c[] = new char[bufferSize];
try
{
InputStreamReader in = new InputStreamReader(socket.getInputStream());
while (true)
{
readSize = in.read(c, resultSize, bufferSize - resultSize);
if (readSize < 0)
break;
resultSize += readSize;
}
}
catch (Exception e)
{}
return new String(c, 0, resultSize);
}
*/
 
使用ServerSocket的accept方法获得socket就可以了
 
我现在关注的是在什么事件中触发读写函数比较好?我不知道当TCPServer收到消息后会触发
什么事件.
网络咖啡:采用你说的办法,那程序就始终处于等待状态,如果没有新的socket进来,就不会
往下走,这怎么解决呢? 还有就是在什么时候调用accept()呢?
 
sun的教科书上这方面写得很不清楚......
不过看起来就ServerSocket与Socket而言,其方法全部为同步方法,也就是一定要等待返回。这也是socket编程的基本方法
而我们在windows中编写socket程序很多都用异步方法,也就是用消息触发。这属于winsock的扩展方法。
就我所知,java中没有消息机制(如果有,请指正)。所以DELPHI的消息型的编程方法已经不适用。
在JAVA里应该就是等待完成一个操作然后才继续执行。
如Socket s=(new ServerSocket).accept();
就是一直等到有人连接才继续执行下一条语句。
所以一般来说这些操作都是要放在不同线程中来进行的,不能像DELPHI中在一个线程里解决所有的问题
 
服务器本来就是为了响应客户端的请求,没收到请求时当然处于
等待状态。
除非用底层Winsocket编程,否则一般不直接调用Accept方法。
当有连接过来时,会自动触发OnAccept事件。
用非阻塞Serversocket的话,就在Onclientread事件中处理信息。
Serversocket open后,就处于侦听状态,一旦客户端有信息传来,
就会触发Onclientread事件,在此处进行处理就可以了。
客户端发送消息可以在Clientsocket的Onconnect事件中进行。一旦
连接成功,就可以会发送消息。
用阻塞Serversocket的话,要创建TServerclientthread的一个继承类。
在Create时创建一个Twinsocketstream;覆盖clientexcute方法,在其中利用
进行Twinsocketstream进行数据的读写。在Serversocket的OnGetThread
事件中创建该继承类以触发读写数据事件。
 
onclientread
 
楼上的两位,你们讲的好象是Delphi的啊,我问的是在JAVA中的应用
 
后退
顶部