android中使用套接字发送和接收字符串
我有一个简单的客户端和服务器套接字应用程序,基于此相互连接。问题是,我可以发送和获取值,但当客户端从服务器获得答案时,会继续发送消息 我的问题在哪里 这是服务器:我的服务器套接字正在服务中。我在服务启动时执行它android中使用套接字发送和接收字符串,android,kotlin,Android,Kotlin,我有一个简单的客户端和服务器套接字应用程序,基于此相互连接。问题是,我可以发送和获取值,但当客户端从服务器获得答案时,会继续发送消息 我的问题在哪里 这是服务器:我的服务器套接字正在服务中。我在服务启动时执行它 class SocketService: Service() { override fun onBind(intent: Intent?): IBinder? { return null } override fun onStartCommand(intent: Intent
class SocketService: Service() {
override fun onBind(intent: Intent?): IBinder? {
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
thread { ClientHandler().run() }
return START_STICKY
}
internal inner class ClientHandler() : Runnable{
override fun run() {
val server = ServerSocket(5000)
val client = server.accept()
var reader = BufferedReader(InputStreamReader(client.getInputStream()))
var writer = PrintWriter(client.getOutputStream())
try {
receiveString = reader.readLine()
while(receiveString != "")
{
println(receiveString)
writer.write("hello from server" + "\n")
writer.flush()
}
writer.close();
reader.close();
server.close();
client.close();
} catch (ex: Exception) {
Timber.e("$TAG $formatted $ex")
}
}
}
我的客户:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
connectToPaymentService()
}
fun connectToPaymentService(){
thread { ThreadopenPort().run() }
}
internal inner class ThreadopenPort : Runnable {
override fun run() {
val socket: Socket
try {
socket = Socket(SERVER_IP, SERVER_PORT)
output = PrintWriter(socket.getOutputStream())
input = BufferedReader(InputStreamReader(socket.getInputStream()))
rMessage = input!!.readLine()
println(rMessage)
while(rMessage != ""){
output!!.write("hello from client" + "\n")
output!!.flush()
rMessage = input!!.readLine()
}
output!!.close();
input!!.close();
socket.close();
} catch (e: Exception) {
e.printStackTrace()
}
}
}
@索利亚萨-
while(receiveString!=“”)
。你循环。。。但是“receiveString”永远不会被修改。所以循环永远不会终止。哎呀李>
建议的备选方案:
我相信这个习惯用法可以成功地应用于套接字“read”循环
请将您发现的内容发回:)建议:尝试“使用”功能块:@paulsm4我检查过了,但看起来没有用。您能举个例子吗?您的服务器只读取行。它从不发短信。但是你的客户在试着读台词。您的客户端将挂起。readLine(),因为没有收到任何消息。@blackapps逻辑是首先客户端发送“来自客户端的你好”,然后服务器将发送“来自服务器的你好”,然后我知道它们彼此连接,但问题是在收到此消息后,我将继续收到消息“来自客户端的你好”不,您的逻辑不同。客户端不会首先向服务器发送一行。客户端首先尝试读取一行。但是服务器从不发送一条线路。因此,客户端“挂起”在.readLine()中。你不知道你的逻辑/协议。谢谢你的帮助,我找到了另一种解决方案,但现在我有另一个问题,你能检查一下吗?
BufferedReader(reader).use { r ->
r.lineSequence().forEach {
println(it)
}
}