java - Android Retrofit 连接 JAVA 套接字
问题描述
如何使用改造 Java 服务器套接字连接。我的服务器有 JAVA 服务器套接字。并想使用 Retrofit 从 android 发送请求。如何通过 Java 套接字建立连接和发送接收的数据
解决方案
这是您可以通过 Retrofit 库连接到 Web 服务的方式。您可以使用此示例做任何您想做的事情:
1-首先你需要创建一个通信器类(做所有的发送接收过程)
public class Communicator {
private static final String TAG = "Communicator";
private static final String SERVER_URL = "http://127.0.0.1/retrofit";
public void loginPost(String username, String password){
//Here a logging interceptor is created
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
//The logging interceptor will be added to the http client
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);
//The Retrofit builder will have the client attached, in order to get connection logs
Retrofit retrofit = new Retrofit.Builder()
.client(httpClient.build())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(SERVER_URL)
.build(); Interface service = retrofit.create(Interface.class);
Call<ServerResponse> call = service.post("login",username,password);
call.enqueue(new Callback<ServerResponse>() {
@Override
public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
BusProvider.getInstance().post(new ServerEvent(response.body()));
Log.e(TAG,"Success");
}
@Override
public void onFailure(Call<ServerResponse> call, Throwable t) {
// handle execution failures like no internet connectivity
BusProvider.getInstance().post(new ErrorEvent(-2,t.getMessage()));
}
});
}
public void loginGet(String username, String password){
//Here a logging interceptor is created
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
//The logging interceptor will be added to the http client
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);
//The Retrofit builder will have the client attached, in order to get connection logs
Retrofit retrofit = new Retrofit.Builder()
.client(httpClient.build())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(SERVER_URL)
.build();
Interface service = retrofit.create(Interface.class);
Call<ServerResponse> call = service.get("login",username,password);
call.enqueue(new Callback<ServerResponse>() {
@Override
public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
BusProvider.getInstance().post(new ServerEvent(response.body()));
Log.e(TAG,"Success");
}
@Override
public void onFailure(Call<ServerResponse> call, Throwable t) {
// handle execution failures like no internet connectivity
BusProvider.getInstance().post(new ErrorEvent(-2,t.getMessage()));
}
});
}
两种顶级方法都用于将用户名和密码发送到服务器进行身份验证。
2-Second 你应该在你的活动中使用通信器类:
public class MainActivity extends AppCompatActivity {
private Communicator communicator;
private String username, password;
private EditText usernameET, passwordET;
private Button loginButtonPost, loginButtonGet;
private TextView information, extraInformation;
private final static String TAG = "MainActivity";
public static Bus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
communicator = new Communicator();
usernameET = (EditText)findViewById(R.id.usernameInput);
passwordET = (EditText)findViewById(R.id.passwordInput);
//This is used to hide the password's EditText characters. So we can avoid the different hint font.
passwordET.setTransformationMethod(new PasswordTransformationMethod());
loginButtonPost = (Button)findViewById(R.id.loginButtonPost);
loginButtonPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
username = usernameET.getText().toString();
password = passwordET.getText().toString();
usePost(username, password);
}
});
loginButtonGet = (Button)findViewById(R.id.loginButtonGet);
loginButtonGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
username = usernameET.getText().toString();
password = passwordET.getText().toString();
useGet(username, password);
}
});
information = (TextView)findViewById(R.id.information);
extraInformation = (TextView)findViewById(R.id.extraInformation);
}
private void usePost(String username, String password){
communicator.loginPost(username, password);
}
private void useGet(String username, String password){
communicator.loginGet(username, password);
}
}
在 onCreate 方法中,我们创建了一个通信器类的实例,并调用 useGet 和 usePost 方法将输入的用户名和密码发送到服务器。
3-不要忘记添加库依赖项(将此代码添加到您的 build.gradle(Module:app) 文件中:
compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup:otto:1.3.8'
compile 'com.google.code.gson:gson:2.6.2'
推荐阅读
- terraform - Terraform local_file 最终计划不一致
- django - 当通过 ManyToMany 关系引用的对象被删除时更新模型
- javascript - 如何在全屏上填充背景图像。目前它在导航栏留下一个空格。并且图像是从顶部剪切的
- azure - 浏览 Azure 学习页面时出现环境错误
- python - 如何在 Spyder 中降级 NumPy 版本
- flutter - 热重载抛出错误,运行应用程序需要重新启动
- database - 在 InfluxDB 中存储多维数据(例如光谱)的推荐方法
- python - 在两个列表中查找重复项时的时间限制
- java - 如何访问对象而不将其作为参数传递?
- r - R:如何在图例中使用不同的列