我刚开始使用TCPSockets.我只想尝试获取谷歌主页.这是我的代码:
require 'socket'
host = 'http://www.google.com'
port = 80
s = TCPSocket.open host, port
s.puts "GET / HTTP/1.1\r\n"
s.puts "Host: Firefox"
s.puts "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
s.puts "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
s.puts "\r\n"
while line = s.gets
puts line.chop
end
s.close
Run Code Online (Sandbox Code Playgroud)
返回:
HTTP/1.1 302 Document has moved
Location: http://92.242.140.29/?nxdomain=http%3A%2F%2Ffirefox&AddInType=2&PlatformInfo=pbrgen
Run Code Online (Sandbox Code Playgroud)
为什么?我的目标是获取谷歌主页的内容.谢谢
我开发了一个包含一个小型http服务器的应用程序.
我的应用程序是在启动时启动的.如果应用程序正常停止(etc/init.d/myappli stop),套接字将被关闭
close (socket_desc);
Run Code Online (Sandbox Code Playgroud)
但如果我用kill -9套接字杀死它将不会被关闭
http服务器代码:
void http_server_init(void)
{
struct sockaddr_in server;
int cr_port;
for(;;) {
cr_port = conf.port;
int i = (DEFAULT_PORT == cr_port)? 1 : 0;
//Create socket
cr_socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (cr_socket_desc == -1)
{
LOG (ERROR,"Could not open server socket, Error no is : %d, Error description is : %s", errno, strerror(errno));
sleep(1);
continue;
}
/* enable SO_REUSEADDR */
int reusaddr = 1;
if (setsockopt(cr_socket_desc, SOL_SOCKET, SO_REUSEADDR, &reusaddr, …Run Code Online (Sandbox Code Playgroud) 我试图在C#中进行Socket编程,现在我需要了解我们是否需要服务器端的套接字数组以便处理多个客户端,或者服务器端的一个套接字足以处理许多客户端;
并且需要配置是否已达到从服务器到客户端的所有数据以及服务器的可用性,丢弃客户端请求.
我们是否还需要创建多个线程来处理每个客户端?我需要单独处理每个客户.
运行此代码
rvm 1.8.7,1.9.3-p547 do ruby -r socket -e "puts TCPSocket == TCPsocket"
Run Code Online (Sandbox Code Playgroud)
为什么在ruby 1.8.7上这是真的吗?
我正在向正确传递的服务器发送消息.
但是,当试图读取结果时,我得到一个例外Socket is closed.
知道如何关闭套接字的输出流同时保持套接字和套接字的输入流打开以获得结果吗?
客户代码:
Socket socket = new Socket("localhost", 9090);
String message = "Some message";
new OutputStreamWriter(socket.getOutputStream(), Charsets.UTF_8)
.append(message)
.close();
// The following line throws the exception when socket.getInputStream() is called:
String fromServer = CharStreams.toString(new InputStreamReader(socket.getInputStream(), Charsets.UTF_8));
Run Code Online (Sandbox Code Playgroud)
例外:
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:903)
at alik.server.test.Client.pingServer(Client.java:24)
Run Code Online (Sandbox Code Playgroud) 假设我有一个服务器XYZ,它侦听 TCP 客户端的端口 50000 和 HTTP 客户端的端口 80。另一方面,我有一个客户端,它使用 WebSocket 建立到端口 50000 的套接字连接,并将使用 HTTP 端口 80 进行握手(当然)。
现在,当客户端启动时,它首先会XYZ通过 HTTP 端口 80 向服务器发送请求,服务器将在端口 80 上接收其握手请求,并发送欢迎响应。因此,在这种情况下,双方都在使用端口 80(当然)。
现在,握手完成后,标准文档表示用于握手目的的 HTTP 请求/响应的同一个 TCP 连接将转换为 TCP 套接字连接。好吧,对。
但是,如果 HTTP 请求/响应的整个握手过程和 TCP 连接第一次使用端口 80,并且相同的 TCP 连接转换为 TCP 套接字连接,并且整个过程是通过端口 80 完成的,那么如何双方的 TCP 套接字是否将相同的 TCP 连接转换为端口 50000?客户端是否会在内部初始化另一个 TCP 连接以更改为端口 50000?
那么,谁能告诉我们如何执行端口转换并在WebSocket从端口 80 到双方不同端口的情况下工作?如何在不同端口上建立完整的单套接字连接?同一个 TCP 连接如何更改/翻转其端口?
我使用c ++开发了客户端服务器程序,所以我希望收到超过500kb,我的客户端消息以"!"结束 ,所以我想收到,直到我的最后一个字节(!)收到,这是我的代码,它不起作用.它有什么问题.
do
{
int num = recv(*csock, buf, bytesLeft,0);
if (num == 0)
{
break;
}
else if (num < 0 && errno != EINTR)
{
fprintf(stderr, "Exit %d\n", __LINE__);
exit(1);
}
else if (num > 0)
{
numRd += num;
buf += num;
bytesLeft -= num;
fprintf(stderr, "read %d bytes - remaining = %d\n", num, bytesLeft);
}
}
while (bytesLeft != 0);
fprintf(stderr, "read total of %d bytes\n", numRd);
Run Code Online (Sandbox Code Playgroud) tcpsocket ×7
sockets ×3
ruby ×2
tcp ×2
c ×1
c# ×1
c++ ×1
client ×1
inputstream ×1
java ×1
outputstream ×1
port ×1
server-side ×1
websocket ×1