我需要编写一个客户端 - 服务器应用程序,其中一个小型服务器放在USB小工具上,并与主机上的客户端应用程序通信.
我之前没有做过这类事情,但我已经完成了webapps,通常,它们都是使用lo环回网络接口在本地机器上开发和调试的.这可能影响了我的思维方式,我正在寻找一种在我的机器上模拟USB主机和小工具的方法,这样我就可以在我的PC上完全构建应用程序的两端,然后再深入了解实际的小工具并获得事情进行着.
这是正确的方法吗?我意识到USB协议是不对称的,并且在这里找到了一些参考,但它似乎是最自然的方式来实现它.
如果这是正确的方式,我该如何从这样的事情开始,是否存在其他人都知道我可能会偶然发现的潜在问题?
我之前从谷歌搜索中找到的参考文献.有Linux内核模块(我的Ubuntu安装的一部分)似乎能够模拟主机和小工具端(分别是dummy_hcd和gadgetfs).我的想法是简单地拥有类似的东西
Host application (client) on PC <-> device file 0 <-> Loopback device <-> device file 1 <-> Gadget application (server) also on PC (will be moved to gadget).
Run Code Online (Sandbox Code Playgroud) 我编写了一个HTTP代理,它做了一些与此无关的东西,但它增加了客户的服务时间(600us没有代理,60000us).我想我已经找到了大部分时间来自哪里 - 在我的代理完成发送回客户端和客户完成接收之间.目前,服务器,代理和客户端在同一主机上运行,使用localhost作为地址.
一旦代理完成发送(至少从send()返回后),我打印gettimeofday的结果,给出一个绝对时间.当我的客户收到时,它会输出gettimeofday的结果.由于它们都在同一主机上,因此这应该是准确的.所有send()调用都没有标志,因此它们是阻塞的.两者之间的差异大约是40000us.
它侦听客户端连接的代理套接字使用提示AF_UNSPEC,SOCK_STREAM和AI_PASSIVE进行设置.推测来自accept()的套接字将具有相同的参数?
如果我正确地理解了这一切,那么Apache设法在600us内完成所有工作(包括导致40000us延迟的相应内容).任何人都可以提出可能导致此问题的原因吗?我已经尝试设置TCP_NODELAY选项(我知道我不应该,只是为了看它是否有所不同)并且完成发送和完成接收之间的延迟时间下降,我忘记了数字但是<1000us.
这一切都在Ubuntu Linux 2.6.31-19上.谢谢你的帮助
谢谢极客!!!
我有一个Android客户端和C#服务器,他们通过socket进行通信.我有这个问题 - 如果我在调试模式下运行我的客户端应用程序并在正确的位置放置一个断点 - 它完美地工作,但没有它它没有.客户端将图像的地址发送到服务器,服务器创建它的缩略图,将其转换为byte []并将其发回.客户端获取byte [],将其转换回图像并显示它.我还发现,当它没有得到正确的字节[]时,它的大小是2896,有时是1448,无论发送的数组的原始大小是多少.
这是客户:
private void connectSocket(String a){
try {
InetAddress serverAddr = InetAddress.getByName("192.168.1.2");
Socket socket = new Socket(serverAddr, 4444);
String message = a;
flag = 0;
if(a.indexOf(".jpg")>0){
flag = 1;
}
ListItems.clear();
if(!a.equalsIgnoreCase("get_drives"))){
//.....
}
if(!ListItems.isEmpty()){
if(ListItems.get(0).matches("^[A-Z]{1}:$")){
ListItems.set(0, ListItems.get(0)+"\\");
}
}
PrintWriter out = null;
BufferedReader in = null;
InputStream is = null;
try {
out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
is = socket.getInputStream();
out.println(message);
String text = …Run Code Online (Sandbox Code Playgroud) 我正在编写一个具有客户端和服务器的并发ATM应用程序.
我需要知道如何使用Socket编程来调用Server方法(请求他当前的余额,转移资金等)并将对象返回给客户端.
我不想只使用System.out.println传递文本,如Lesson:All About Sockets中所述
我有关于插座/客户端的问题....
我刚刚用C#编写了一个客户端服务器程序.我想知道,你如何连接到具有不同IP地址的计算机.例如,如果我想在两台不同的机器上单独运行客户端和服务器,则loopback(或使用localhost)将不允许这样....
不太熟悉网络,任何帮助将不胜感激..这是我在客户端的代码处理环回:
TcpClient client = new TcpClient();
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);
Run Code Online (Sandbox Code Playgroud) 我正在开发一个二进制文件传输程序,客户端必须将文件上传到服务器.对于这种情况,我需要先发送文件名,然后再发送文件内容.但这对我来说不可行.
让我们看看代码:
// Client-side code to send file name
void sendFileName(
int sd, /*Socket Descriptor*/
char *fname) /*Array Containing the file name */
{
int n , byteswritten=0 , written ;
char buffer[1024];
strcpy(buffer , fname);
n=strlen(buffer);
while (byteswritten<n)
{
written=write(sd , buffer+byteswritten,(n-byteswritten));
byteswritten+=written;
}
printf("File name : %s sent to server \n",buffer);
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我在socket上编写文件名,服务器将从socket读取名称,如下所示:
// Server-side code to read file name from client
while ((n = read((int)connfd, (fname + pointer), 1024)) > 0)
{
pointer=pointer+n;
}
Run Code Online (Sandbox Code Playgroud)
好吧,问题是我必须在发送文件名后关闭客户端的写端,该文件名将是服务器端代码的FIN段,以停止从服务器读取.
如果我关闭读取结束,如:
shutdown(sd,SHUT_WR); …Run Code Online (Sandbox Code Playgroud) 我从来没有构建任何可以与服务器通信的Android应用程序.我想要做的是我想发送用户名和密码到服务器,在服务器上匹配它们,当用户名和密码匹配下一个屏幕时应该显示.下一个屏幕应该只有一个文本视图说"欢迎用户名".
我希望你们一步一步地告诉我-
我没有真正的服务器.我将在localhost上运行整个代码.
更新:
这是我在Android应用中编写的内容.我不知道多少是对的.
public void clicked(View v) {
System.out.println("button clicked");
EditText username = (EditText) findViewById(R.id.edituser);
EditText password = (EditText) findViewById(R.id.editpass);
Editable user = username.getText();
Editable pass = password.getText();
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.1.101:8080//WebApplication1/sendresponse.java");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("username", user.toString()));
nameValuePairs.add(new BasicNameValuePair("password", pass.toString()));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
Header[] headers = response.getAllHeaders(); …Run Code Online (Sandbox Code Playgroud) 我今天早些时候遇到过这个问题.这是我的第一个网络应用程序.
server.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
s = socket.socket()
host = socket.gethostname()
# Reserve a port for your service.
port = 12345
# Bind to the port
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
# Now wait for client connection.
s.listen(1)
conn, addr = s.accept()
try:
while True:
# connection, address
content = conn.recv(1024)
if content in ('status', 'stop', 'start', 'reload', 'restart'):
conn.send('%s received' % content)
else:
conn.send('Invalid command')
except KeyboardInterrupt:
conn.close()
s.shutdown(socket.SHUT_RDWR)
s.close()
Run Code Online (Sandbox Code Playgroud)
client.py
#!/usr/bin/python
# -*- …Run Code Online (Sandbox Code Playgroud) TCP / IP客户端套接字程序。在这里,我的主要要求是客户端发送消息,服务器接收消息,并使用服务器IP地址和端口号存储在C#.Net的数据库表中。