在android中使用套接字发送和接收字符串



我有一个简单的客户端和服务器套接字应用程序基于此代码相互连接。问题是我可以发送和获取值,但当客户端从服务器获得答案时,我会继续发送消息。

我的问题在哪里?

这是服务器:我的服务器套接字在服务中。当服务启动时,我执行它

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()
}
}
}

@saulyasar-

  1. 如果我给你举一个例子,它应该是Java,而不是Kotlin;(
  2. 从风格上讲,你应该更喜欢"use(("以明确";close((";。这对你眼前的问题没有帮助,但这是一个好习惯:(
  3. 您的问题是:while(receiveString != "")。你循环。。。但是";receiveString";永远不会被修改。所以循环永远不会终止。哇

建议的替代方案:

while表达式中不允许赋值?

BufferedReader(reader).use { r ->
r.lineSequence().forEach {
println(it)
}
}

我相信这个习语可以成功地应用到您的套接字";读取";环

请将您的发现寄回:(

最新更新