我有一些问题,如果不工作,我无法在家检查.这是代码
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Net.Security;
class Program
{
private static IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
private static int port = 6000;
private static string data = null;
static void Main(string[] args)
{
Thread thread = new Thread(new ThreadStart(receiveThread));
thread.Start();
Console.ReadKey();
}
public static void receiveThread()
{
while (true)
{
TcpListener tcpListener = new TcpListener(ipAddress, port);
tcpListener.Start();
Console.WriteLine("Waiting for connection...");
TcpClient tcpClient = tcpListener.AcceptTcpClient();
Console.WriteLine("Connected with {0}", tcpClient.Client.RemoteEndPoint);
while (!(tcpClient.Client.Poll(20, SelectMode.SelectRead)))
{
NetworkStream networkStream …Run Code Online (Sandbox Code Playgroud) 任何人都能指出这段代码中的缺陷吗?我正在使用TcpClient检索一些HTML.与IIS服务器通信时,NetworkStream.Read()似乎永远不会完成.如果我去使用Fiddler代理,它可以正常工作,但直接与目标服务器通信时,.read()循环将不会退出,直到连接异常时出现"远程服务器已关闭连接"之类的错误.
internal TcpClient Client { get; set; }
/// bunch of other code here...
try
{
NetworkStream ns = Client.GetStream();
StreamWriter sw = new StreamWriter(ns);
sw.Write(request);
sw.Flush();
byte[] buffer = new byte[1024];
int read=0;
try
{
while ((read = ns.Read(buffer, 0, buffer.Length)) > 0)
{
response.AppendFormat("{0}", Encoding.ASCII.GetString(buffer, 0, read));
}
}
catch //(SocketException se)
{
}
finally
{
Close();
}
Run Code Online (Sandbox Code Playgroud)
更新
在调试器中,我可以看到整个响应立即通过并附加到我的StringBuilder(响应).当服务器完成发送响应或我的代码没有检测到它时,似乎连接没有被关闭.
结论 正如这里所说的,最好利用协议的产品(在HTTP的情况下,Content-Length头)来确定事务何时完成.但是,我发现并非所有页面都设置了内容长度.所以,我现在正在使用混合解决方案:
对于所有事务,请将请求的Connection标头设置为"关闭",以防止服务器保持套接字打开.这可以提高服务器在响应您的请求时关闭连接的几率.
如果Content-Length已设置,请使用它来确定请求何时完成.
否则,将NetworkStream的RequestTimeout属性设置为一个大但合理的值,如1秒.然后,循环开启,NetworkStream.Read()直到a)超时发生,或b)您读取的字节数比您要求的少.
感谢大家的出色和详细的回复.
我正在尝试与套接字协商telnet连接.套接字正在工作,但服务器告诉我那件事:
ÿýÿýÿûÿû
login:
Run Code Online (Sandbox Code Playgroud)
所述ÿýÿýÿûÿû手段255 253 1 255 253 31 255 251 1 255 251 3
我读了所有的RFC文档,但我不明白,我应该与响应能够(字符串ASCII数据?)发送到服务器,我的愿望是成功运行login提示符,然后发送命令到像"一台服务器停止"或其他东西.
提前感谢您的回答.
我TCP/CLIENT在Visual Studio 2010中有一个游戏服务器项目.当我以调试模式启动项目时,稍后(有时1天,有时1周)Visual Studio退出调试时没有任何异常或错误.我检查了窗口和应用程序日志,那里没有任何意外.
我怎样才能找出真正的问题是什么或者什么(例如像stackoverflow这样的一些例外)会导致Visual Studio退出调试?
我一直在高低搜索,但是到目前为止我所看到的一切,人们只是告诉我使用其他方法.
有了这个,我的问题是我正在尝试使用socks 5代理通过TcpClient连接到服务器
我目前的设置是:
Client = new TcpClient();
Client.Connect(EndPoint);
NetworkStream = Client.GetStream();
Stream = new new BufferedStream(NetworkStream);
Stream.Write...//Write Packet information etc
Run Code Online (Sandbox Code Playgroud)
我不确定我是否错过了任何信息,所以如果我有,我会很高兴地更新这个.
我正在开发一个应用程序,其中c sharp服务器与android客户端通信.服务器需要向Android tcpClient发送多条消息.至于发送消息,我必须关闭服务器上的tcpClient对象.否则它不会发送.一旦tcpClient关闭,我怎么能再次与我的客户端通信,我怎么能跟踪和发送多个消息,一旦我关闭tcpClient,或者有任何其他方式发送而不关闭它.如果问题仍不明确,请在下面发表评论
它发送一个消息easlity但我需要不时发送更多的消息
这是服务器的代码片段
//in a thread
void receivingMessages(object param)
{
try
{
var paramArray = (object[])param;
var id = paramArray[0];
var client = paramArray[1] as TcpClient;
var stream = client.GetStream();
while (true)
{
byte[] buffer = new byte[2048];
int bytesRead = stream.Read(buffer, 0, 2048);
if (bytesRead > 0)
{
StringBuilder sb = new StringBuilder();
string v = Encoding.ASCII.GetString(buffer);
int index = v.IndexOf('\0');
string trimmedXml = v.TrimEnd(new char[] { '\0' });
var root = XDocument.Parse(trimmedXml).Root;
//to get the type …Run Code Online (Sandbox Code Playgroud) 我有简单的服务器从客户端获取字符串并将其打印在屏幕上.我也有简单的客户端,发送数据和关闭:
static void Main()
{
var client = new TcpClient("localhost", 26140);
var stream = client.GetStream();
Byte[] data = System.Text.Encoding.UTF8.GetBytes("CALC qwer");
stream.Write(data, 0, data.Length);
stream.Close();
client.Close();
//Thread.Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
并且使用未注释的字符串'Thread.Sleep(100)'它可以正常工作.但是在评论时,有时候(5-10次运行中的1次)客户端不会发送字符串.看着wireshark和netstat我注意到客户端发送SYN,ACK包,建立连接并退出而不发送任何内容而不关闭套接字.
任何人都可以解释这种行为吗?睡眠有帮助吗?我究竟做错了什么?
UPD:
有了这个示例代码,在关闭之前添加flush()确实有效,感谢Fox32.
但在它之后我回到了我的初始代码:
var client = new TcpClient("localhost", 26140);
client.NoDelay = true;
var stream = client.GetStream();
var writer = new StreamWriter(stream);
writer.WriteLine("CALC qwer");
writer.Flush();
stream.Flush();
stream.Close();
client.Close();
Run Code Online (Sandbox Code Playgroud)
即使使用NoDelay,它也无法正常工作.这很糟糕 - 在网络流上使用StreamWriter?
UPD:
这是服务器代码:
static void Main(string[] args)
{
(new Server(26140)).Run();
}
Run Code Online (Sandbox Code Playgroud)
在Server类中:
public void Run()
{
var listener = new TcpListener(IPAddress.Any, port); …Run Code Online (Sandbox Code Playgroud) 我正在寻找的是一个简单的TCPClient/Listener("hello world")示例.我是新手,Microsoft TCPClient/Listener类示例不是我想要的.我正在寻找的是TCPClient发送消息"Hello world"和TCPListener获取消息并发回消息"我收到了你的hello world消息"?
一点点帮助会很棒.我只有TCPClient发出"Hello World".这会有用吗?
Dim port As Int32 = 13000
Dim client As New TcpClient("192.168.0.XXX", port)
' Translate the passed message into ASCII and store it as a Byte array.
Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes("Hello World")
' Get a client stream for reading and writing.
' Stream stream = client.GetStream();
Dim stream As NetworkStream = client.GetStream()
' Send the message to the connected TcpServer.
stream.Write(data, 0, data.Length)
Run Code Online (Sandbox Code Playgroud) 我有以下代码,这是不言自明的:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host, port)
s.send("some data")
# don't close socket just yet...
# do some other stuff with the data (normal string operations)
if s.stillconnected() is true:
s.send("some more data")
if s.stillconnected() is false:
# recreate the socket and reconnect
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host, port)
s.send("some more data")
s.close()
Run Code Online (Sandbox Code Playgroud)
如何实现s.stillconnected()
我不想盲目地重新创建套接字。
在以下场景中;
System.Net.Sockets.TcpClient TC = SomeHowObtained;
System.Net.Sockets.NetworkStream NS = TC.GetStream();
Run Code Online (Sandbox Code Playgroud)
使用NS.DataAvailable和检查有什么区别TC.Available > 0吗?
tcpclient ×10
c# ×7
sockets ×3
tcplistener ×3
networking ×2
tcp ×2
android ×1
asp.net ×1
connection ×1
ip ×1
proxies ×1
python ×1
telnet ×1
thread-sleep ×1
vb.net ×1